NoSuchMethodError au démarrage dans L'application Java Jersey
J'ai eu une erreur très étrange en essayant de démarrer une application Jersey sur Tomcat. Le même code fonctionne sur d'autres ordinateurs. J'ai essayé de réinstaller tomcat, toutes mes dépendances maven, même Eclipse et Java lui-même, pas de chance. Il semble qu'une mauvaise version de Jersey est en cours de chargement, je pense?
Tous les pointeurs dans la bonne direction seront appréciés.
Voici le pom efficace: http://pastebin.com/NacsWTjz
Et le pom réel: http://pastebin.com/H6sHe4ce
2015-02-13 13:43:40,870 [localhost-startStop-1] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/middleware-server] - StandardWrapper.Throwable
java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:304)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:285)
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:170)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:358)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4901)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5188)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
3 réponses
Remarque: veuillez consulter les commentaires ci-dessus pour plus de discussion et de conseils.
Cette erreur habituelle signifie que vous avez à la fois un jar JAX-RS 1 et JAX-RS 2 sur le classpath. Jersey 2 utilise JAX-RS 2 (javax.ws.rs-api-2.0.1.jar
), mais si vous avez aussi le jsr311-api.jar
, qui est JAX-RS 1, Il y a un javax.ws.rs.core.Application
dans chaque pot. Mais l'jsr311-api
Application
n'ont pas la méthode getProperties()
(d'où NoSuchMethodError
).
Je suis arrivé à la conclusion que tout ce que vous devez faire est d'ajouter l'exclusion ci-dessus à la dépendance swagger. Le Jackson 2.0 le fournisseur (qui dépend de JAX-RS 1) semble être remplacé par un fournisseur 2.4.1 (qui utilise la nouvelle version). Nous n'avons donc pas besoin de l'Ajouter nous-mêmes. Quand il est remplacé, il semble laisser derrière lui le jsr311-api.jar
. Donc, si nous l'excluons, personne ne peut essayer de l'utiliser, ce qui semble être le problème actuel
<dependency>
<groupId>com.wordnik</groupId>
<artifactId>swagger-core_2.10</artifactId>
<version>1.3.11</version>
<exclusions>
<exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Nous utilisons jersey-json
1.9 qui a une dépendance sur jersey-core
qui a aussi une classe javax.ws.rs.core.Application
.
Donc, notre solution est d'exclure le jersey-core de jersey-json
:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.9</version>
<exclusions>
<exclusion>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
</exclusion>
</exclusions>
</dependency>
Vous pouvez changer la version de tomcat à 7 alors il ne sera pas nécessaire de changer pom.xml