Je rencontre un problème lors du déploiement d'un service dans Tomcat 8. Obtention de l'erreur suivante:
Causée par: Java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName () Ljava/lang/String; à org.Apache.Tomcat.websocket.server.WsServerContainer. (WsServerContainer.Java:149) à org.Apache.Tomcat.websocket.server.WsSci.init (WsSci.Java:131) à org.Apache.Tomcat.websocket.server.WsSci.onStartup (WsSci.Java:47) à org.Apache.catalina.core.StandardContext.startInternal (StandardContext.Java:5244) à org.Apache.catalina.util.LifecycleBase.start (LifecycleBase.Java:150) ... 10 plus
La méthode getVirtualServerName
a été introduite dans Servlet 3.1 et après avoir extrait MANIFEST.MF
de mon jarre servlet-api
, j'ai obtenu les détails suivants:
Specification-Title: Java API for Servlets
Specification-Version: 3.1
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: javax.servlet
Ce qui dit que c'est avoir 3.1. Y a-t-il une autre raison à cette erreur? S'il vous plaît aider
Vérifiez toutes vos dépendances Maven (ou équivalentes) et assurez-vous que vous (ou probablement une autre dépendance) n'extrayez pas une version antérieure à la version 3.1 du javax.servlet / servlet-api
qui peut avoir priorité sur celle de votre Tomcat 8. Si vous avez manuellement déployé, assurez-vous que vous n'avez pas copié manuellement les fichiers JAR de servlet-api dans Tomcat même.
la méthode getVirtualServerName
a été ajoutée dans ServletContext dans Servlet 3.1. Trouver la méthode du document Java getVirtualServerName
ce problème peut avoir au moins 3 causes:
votre version de servlet est plus ancienne que 3.1.
autre jar a la servlet version plus ancienne que 3.1.
votre version de Tomcat a plus de 8 ans
pour le résoudre, vous pouvez essayer la méthode ci-dessous.
I. vérifier votre pom.xml s’il existe le code ci-dessous.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
si votre pom.xml a le code ci-dessus, il aurait toujours ce problème. vous pouvez faire le deuxième chemin.
II. pour vérifier votre autre jarre, reportez-vous à la jarre javax.servlet-api
. Par exemple, le org.Apache.santuario
doit faire référence au jar javax.servlet-api
. le pom.xml:
<dependency>
<groupId>org.Apache.santuario</groupId>
<artifactId>xmlsec</artifactId>
<version>1.4.3</version>
</dependency>
mais lorsque vous examinez les dépendances maven, vous vous référez au fichier jar javax.servlet-api
dont la version est antérieure de 3.1 à 3.1.
vous devez donc exclure la version 2.3. pom.xml:
<!-- exclude servlet-api 2.3 jar-->
<dependency>
<groupId>org.Apache.santuario</groupId>
<artifactId>xmlsec</artifactId>
<version>1.4.3</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- servlet-api 3.1 version has getVirtualServerName() -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
III. spring boot exécute Tomcat 7 par défaut. Définissez donc votre version de Tomcat 8 au lieu de Tomcat 7. ajoutez donc le code de votre pom.xml:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<Java.version>1.8</Java.version>
<Tomcat.version>8.5.5</Tomcat.version>
</properties>
J'ai eu cette erreur sur IntelliJ avec Maven après avoir mis à jour IntelliJ.
Je pourrais faire les tests avec maven mais pas depuis mon IDE.
J'ai résolu le problème en supprimant les fichiers ./idea
et project.iml
et en rechargeant le projet.
Résolu Sur mon Mac avec Java 8, le problème était avec Tomcat téléchargé à partir du site et décompressé.
Mon problème a été résolu car il y avait un fichier supplémentaire servlet-api.jar qui a été récupéré. Il venait de /Library/Java/Extensions/servlet-api.jar
Pour le trouver sur votre système, vous pouvez utiliser Sudo find/-name servlet-api.jar
Supprimez-le en le sauvegardant ailleurs.
Je suivais ceci pour l'installation https://Gist.github.com/ddanailov-nmdp/c97aba2ca926b9627f6b4f7174083a32
Spring Boot exécutera Tomcat 7 par défaut, vous devez remplacer le fichier maven build Tomcat.version dans votre pom.xml. Voir ci-dessous pour exécuter Tomcat 8.0.30
<properties>
<Tomcat.version>8.0.30</Tomcat.version>
</properties>
Devrait résoudre votre problème.
Après une énorme douleur et un examen minutieux de toutes ces réponses superposées, la seule chose qui a finalement fonctionné pour moi a été de passer de Tomcat8 à Tomcat7. Je sais que ce n’est pas une solution idéale, et c’est peut-être une nouvelle installation de Tomcat qui a résolu mon problème. Si tout échoue, essayez-le.