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
37
demandé sur ROMANIA_engineer 2014-06-06 15:16:33

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>
25
répondu amuniz 2014-10-07 09:12:13

si vous voulez savoir d'où la classe est chargée, essayez

java -verbose:class -jar foo.jar | grep javax.servlet.ServletContext

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!/]
25
répondu Emerson Farrugia 2015-02-20 11:02:02

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'
}
21
répondu kumetix 2015-04-12 12:22:21

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

6
répondu Shoham 2015-05-28 09:17:06

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> 
6
répondu Pedro Hoehl Carvalho 2015-08-19 17:33:29

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).

6
répondu Bohemian 2016-02-23 03:00:46

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.

5
répondu kkonrad 2015-04-16 13:11:52

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>
5
répondu Praveen Kumar K S 2016-07-09 08:18:34

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:)

3
répondu thyzz 2016-05-08 10:17:27

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.

2
répondu ghostcoder007 2016-03-24 07:32:08

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>
2
répondu Olga 2016-04-20 15:46:05

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!

2
répondu baraka 2016-11-10 07:37:09

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.

1
répondu whistling_marmot 2017-05-23 12:18:15

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.

1
répondu Bipin Butala 2016-04-18 17:16:17

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.

0
répondu road2victory 2015-08-20 10:34:27