java.lang.NoSuchMethodError javax.servlet.ServletContext.getVirtualServerName()
Kürzlich bin ich bei der Arbeit an meinem Spring Boot-Projekt auf eine Fehlermethode gestoßen, die getVirtualServerName nicht gefunden hat. Dieser Fehler war sehr häufig und lästig. Während der Ausführung des Spring Boot-Projekts stieß ich auf NoSuchMethodError javax.servlet.ServletContext.getVirtualServerName()
Ausnahme. Trotz der Maven-Abhängigkeit war es schwieriger herauszufinden, wo die servlet-api
jar kam in meinen Projekterstellungspfad. In meinem Beitrag zum Umgang mit Ausnahmen habe ich gezeigt, wie man besser mit Ausnahmen umgeht.
Ausgabe –
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]] at java.util.concurrent.FutureTask.report(FutureTask.java:122) [na:1.8.0_91] at java.util.concurrent.FutureTask.get(FutureTask.java:192) [na:1.8.0_91] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:911) ~[tomcat-embed-core-8.5.6.jar:8.5.6] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:890) [tomcat-embed-core-8.5.6.jar:8.5.6] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.6.jar:8.5.6] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1403) [tomcat-embed-core-8.5.6.jar:8.5.6] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) [tomcat-embed-core-8.5.6.jar:8.5.6] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_91] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_91] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_91] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91] Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.6.jar:8.5.6] ... 6 common frames omitted Caused by: org.apache.catalina.LifecycleException: Failed to start component [Pipeline[StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.6.jar:8.5.6] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5099) ~[tomcat-embed-core-8.5.6.jar:8.5.6] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.6.jar:8.5.6] ... 6 common frames omitted Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.authenticator.NonLoginAuthenticator[]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) [tomcat-embed-core-8.5.6.jar:8.5.6] at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:170) ~[tomcat-embed-core-8.5.6.jar:8.5.6] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.6.jar:8.5.6] ... 8 common frames omitted Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; at org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1125) ~[tomcat-embed-core-8.5.6.jar:8.5.6] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.6.jar:8.5.6] ... 10 common frames omitted
Grund –
Je nach Baupfad servlet-api
jar, das vorhanden ist, ist nicht die richtige Version. Wenn es älter als 3.1 ist, enthält es die Methode getVirtualServerName()
nicht .
Wie habe ich dieses Problem gelöst?
Ich beschreibe die Lösung separat, aber wie ich das Problem hier analysiert habe. Ich habe servlet-api
durchlaufen jar und versucht, die Klasse ServletContext
zu finden die diese Methode enthält. Aber die Jar-Datei, die ich in meinem Projekt hatte, enthielt diese Methode nicht. Deshalb das Problem. Dann war es einfach, basierend auf Maven-Abhängigkeiten herauszufinden. Sobald ich einen Abhängigkeitsbaum hatte, konnte ich die Abhängigkeit festnageln, die die alte Version von servlet-api
brachte Glas.
Lösung –
- Ändern Sie die Version von
servlet-api
Glas - Wenn Sie bedenken, dass dies ein Spring-Boot-Projekt ist, stellen Sie eine Version von Tomcat bereit, anstatt den standardmäßigen Tomcat 8.x zu verwenden, den Spring-Boot bereitstellt.
- In meinem Fall bestand die Lösung darin,
javaee.jar
zu entfernen aus dem Erstellungspfad, derservlet-api
brachte einer älteren Version. Als ich die Java-Laufzeitbibliothek von 1.8 auf 1.7 geändert habe, lief das Projekt wie am Schnürchen.
Schlussfolgerung
In diesem Beitrag habe ich gezeigt, wie der Fehler getVirtualServerName in ServletContext behoben werden kann. Wenn Ihnen dieser Beitrag gefallen hat, abonnieren Sie meinen Blog.