NoSuchMethodError al inicio en la aplicación Java Jersey
maven jax-rs (4)
Recibí un error muy extraño al intentar iniciar una aplicación de Jersey en Tomcat. El mismo código funciona en otras computadoras. Intenté reinstalar Tomcat, todas mis dependencias de Maven, incluso Eclipse y Java, sin suerte. Parece que se está cargando una mala versión de Jersey, creo.
Cualquier puntero en la dirección correcta será apreciado.
Aquí está el pom efectivo: http://pastebin.com/NacsWTjz
Y el pom real: 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)
Estamos usando
jersey-json
1.9, que depende de
jersey-core
que también tiene una clase
javax.ws.rs.core.Application
.
Entonces, nuestra solución es excluir el
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>
Puede cambiar la versión de tomcat a 7 y luego se ejecutará sin necesidad de cambiar pom.xml
el problema está relacionado con "com.sun.jersey: jersey-core: jar: 1.18.3" (o cualquier versión 1. *) porque las versiones antiguas de Jersey no tenían ese método "map Map getProperties ()" público.
Y una de sus dependencias usa Jersey versión 1 (puede verificar eso al ejecutar mvn dependency: tree y buscar todas las versiones de jersey-core utilizadas)
Me he resuelto el problema eliminando todas las dependencias com.sun.jersey (antigua api) y utilizando la nueva API org.glassfish.jersey
https://mvnrepository.com/artifact/org.glassfish.jersey.core
Nota: Vea los comentarios anteriores para más discusión y consejos.
Este error generalmente significa que tiene un jar JAX-RS 1 y JAX-RS 2 en el classpath.
Jersey 2 usa JAX-RS 2 (
javax.ws.rs-api-2.0.1.jar
), pero si también tiene
jsr311-api.jar
, que es JAX-RS 1, hay un
javax.ws.rs.core.Application
.
javax.ws.rs.core.Application
en cada jarra.
Pero la aplicación
jsr311-api
no tiene el método
getProperties()
(de ahí
NoSuchMethodError
).
Llegué a la conclusión de que todo lo que necesita hacer es agregar la exclusión anterior a la dependencia swagger.
El proveedor Jackson 2.0 (que depende de JAX-RS 1) parece estar anulado por un proveedor 2.4.1 (que usa la nueva versión).
Así que no necesitamos agregarlo nosotros mismos.
Cuando se anula, parece dejar atrás el
jsr311-api.jar
.
Entonces, si lo excluimos, nadie puede intentar usarlo, lo que parece ser el problema actual
<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>