java maven jersey jax-rs jersey-2.0

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>