Obtenir nosuchmethoderror: javax.servlet.ServletContext.addServlet dans le démarrage à ressort lors de l'exécution D'une application MVC à ressort
je suis en dessous de l'exception quand j'essaie d'exécuter une application MVC de ressort en utilisant la botte de ressort...
ContainerBase: A child container failed during start
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)
at java.util.concurrent.FutureTask.get(FutureTask.java:188)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:799)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
... 6 more
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.addServlet(Ljava/lang/String;Ljavax/servlet/Servlet;)Ljavax/servlet/ServletRegistration$Dynamic;
at org.springframework.boot.context.embedded.ServletRegistrationBean.onStartup(ServletRegistrationBean.java:166)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onStartup(EmbeddedWebApplicationContext.java:214)
at org.springframework.boot.context.embedded.tomcat.ServletContextInitializerLifecycleListener.lifecycleEvent(ServletContextInitializerLifecycleListener.java:54)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5355)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 6 more
15 réponses
Je l'ai résolu en excluant une dépendance transitive servlet-api.
dans mon cas, c'était com.github.isrsal: spring-mvc-logger
<dependency>
<groupId>com.github.isrsal</groupId>
<artifactId>spring-mvc-logger</artifactId>
<version>0.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
si vous voulez savoir d'où la classe est chargée, essayez
java -verbose:class -jar foo.jar | grep javax.servlet.ServletContext
où foo.jar
est le pot à graisse produit par Grad ou Maven. Par exemple, la classe ServletContext
pourrait être lue à partir d'un ancien JAR servlet-api
dans un répertoire JDK extensions au lieu de vos dépendances Maven ou Grad.
la sortie de La commande ressemble à ceci...
$ java -verbose:class -jar build/libs/foo-0.2.3.jar | grep javax.servlet.ServletContext
[Loaded javax.servlet.ServletContext from jar:file:.../build/libs/foo-0.2.3.jar!/lib/javax.servlet-api-3.1.0.jar!/]
[Loaded javax.servlet.ServletContextListener from jar:file:.../build/libs/foo-0.2.3.jar!/lib/javax.servlet-api-3.1.0.jar!/]
[Loaded javax.servlet.ServletContextAttributeListener from jar:file:.../build/libs/foo-0.2.3.jar!/lib/javax.servlet-api-3.1.0.jar!/]
gradle solution.
j'ai eu un problème similaire dans ma lib pot qui a apporté avec elle une vieille version de javax.servlet.ServletContext qui a ensuite été chargé par mon module de démarrage à ressort au lieu de sa propre classe fournie, par ce qui provoque un NoSuchMethodError
Je l'ai corrigé en éditant la compilation.grad de mon module lib:
configurations {
provided.all*.exclude group: 'javax.servlet'
}
j'ai eu cela dans une webapp de démarrage à ressort, seulement dans le serveur de déploiement (fonctionnait bien sur ma machine locale). Je le résous en ajoutant:
<dependencies>
<!-- … -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- … -->
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html
pour toute autre personne qui ne pourrait pas le résoudre en excluant servlet-api
, voici une alternative:
il s'avère que la botte de printemps est par défaut Tomcat 8. Si vous utilisez une version différente de Tomcat et que vous souhaitez corriger cette erreur, ajoutez simplement votre version tomcat aux propriétés pom:
<properties>
<tomcat.version>7.0.63</tomcat.version>
</properties>
j'ai eu ce problème quand j'ai essayé de démarrer mon serveur de démarrage pendant tests (en utilisant gradle + spock). J'ai tracé le problème jusqu'à la bibliothèque wiremock.
Ce fixe:
testCompile('com.github.tomakehurst:wiremock:1.58') {
exclude module: 'servlet-api' // this exclude fixed it
}
FYI
gradle dependencies
montre (version abrégée):
\--- com.github.tomakehurst:wiremock:1.58
+--- org.mortbay.jetty:jetty:6.1.26
+--- org.mortbay.jetty:jetty-util:6.1.26
\--- org.mortbay.jetty:servlet-api:2.5-20081211
L'ancienne (2008) org.mortbay.jetty:servlet-api
pot contient une version de ServletContext
qui est incompatible avec la version 1.3.2 de la botte de printemps (fonctionnait bien au moins jusqu'à 1.2.6).
j'utilisais Gradle et ce qui a fonctionné pour moi:
configurations {
all*.exclude group: '', module: 'servlet-api'
}
il a coupé l'arbre de dépendance de la manière désirée.
je courais avec Hadoop 2.7.2 en utilisant Spring-boot, les dépendances Hadoop suivantes utilisent javax.servlet qui a empêché la version tomcat embarquée de démarrer. Au-dessous des exclusions dans mon POM a fixé l'émission .
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.2</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-hadoop-boot</artifactId>
<version>2.3.0.RELEASE-hadoop26</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.2</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>
selon cette solution: https://stevewall123.wordpress.com/2015/04/17/spring-boot-application-and-tomcat-error-a-child-container-failed-during-start /
vous pouvez modifier la version Tomcat en paramétrant le" tomcat.version "propriété:
ext['tomcat.version'] = '7.0.63' //my version of Tomcat
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web'
}
ça marche pour moi, merci à l'auteur de cet article.
Cheers:)
si vous utilisez STS et que vous avez ajouté la bibliothèque Groovy à votre projet (Project Properties -> Java Build Path -> Libraries), alors assurez-vous de sélectionner l'option" no, only include groovy-all". L'autre option de "Oui, inclure groovy et bsf.pot. .., servlet-2.4.jar " ajoute servlet-2.4.jar qui entre en conflit avec les classes tomcat8 intégrées résultant de ce problème.
j'utilise Jetty dans mon projet et j'ai eu la même erreur. Ma solution rapide a été d'exclure Tomcat intégré de la dépendance Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-ws</artifactId>
<version>1.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
Je ne pouvais pas trouver la référence problématique sauf pour savoir qu'il est en quelque sorte entrer dans ma classe-chemin donc voici mes 2 cents pour les développeurs paresseux utilisant eclipse:
Faites défiler vers le bas la liste des dépendances maven sous votre arborescence de projet (généralement sous Ressources Java -> bibliothèques -> dépendances Maven), suivez la jar ajoutée problématique que vous souhaitez exclure de votre JAR empaqueté, cliquez droit dessus -> sélectionnez Maven -> Exclude Maven Artifact ! Voila - une exclusion sera automatiquement ajoutée à votre droit pom sous la dépendance qui la renvoie.
Mine BTW was jcifs...
<dependency>
<groupId>org.codelibs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.18.2</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>
bonne chance!
mvn dependency:tree
n'a pas révélé le servlet-api.jar
sur mon chemin de classe, mais un clic droit sur le projet (dans Eclipse) et aller à Build Path / Configure Build Path a montré que mon espace de travail par défaut JRE, JDK 1.7.0_51, avait ce jar dans son répertoire jre/lib/ext
(au moins dans mon installation). J'ai essayé de le supprimer de mon classpath. La solution de @Pedro de forcer la version tomcat à 7 a fonctionné. Donc, ne installation de la dernière version de Java 7: JDK 1.7.0_79.
j'ai également fait face à cette erreur. J'ai un projet Maven/Spring MVC/Spring Boot. J'utilise IntelliJ comme IDE et chaque fois que j'ajoute de nouvelles dépendances au POM.xml l'IDE modifie le .iml fichier (comme prévu), mais ce qui est bizarre, c'est qu'il déplace la ligne suivante en haut du fichier:
<orderEntry type="library" name="Java EE 6-Java EE 6" level="project" />
une fois que cela se produit mon projet ne compilera pas et je reçois la même erreur:
de java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName () Ljava/lang/String;
en déplaçant simplement L'orderEntry pour Java EE vers le bas l'erreur disparaît et je peux compiler une fois de plus.
pour une solution rapide, j'ai retiré le servlet-api.jar manuellement à partir de la lib et que construire l'application et il fonctionne.Bien que, idéalement comme suggéré par Kumetix, on devrait avoir besoin d'examiner jusqu'à la dépendance qui le fait charger dans classpath.