TomcatでJerseyアプリを起動しようとすると、非常に奇妙なエラーが発生します。同じコードが他のコンピューターでも機能します。 Tomcatと、Mavenの依存関係すべて、EclipseとJava自体、運がありません。悪いJerseyバージョンがロードされているようです。
正しい方向へのポインタはありがたいです。
有効なPOMは次のとおりです。 http://Pastebin.com/NacsWTjz
そして実際のPOM: 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)
注:詳細な説明とヒントについては、上記のコメントを参照してください。
このエラーは通常、クラスパスにJAX-RS 1とJAX-RS 2の両方のjarファイルがあることを意味します。 Jersey 2はJAX-RS 2(_javax.ws.rs-api-2.0.1.jar
_)を使用しますが、_jsr311-api.jar
_もJAX-RS 1である場合、各jarには_javax.ws.rs.core.Application
_があります。しかし、_jsr311-api
_ Application
にはメソッドgetProperties()
がありません(したがってNoSuchMethodError
)。
上記の除外をswagger依存関係に追加するだけでよいという結論に達しました。 Jackson 2.0プロバイダー(JAX-RS 1に依存)は、2.4.1プロバイダー(新しいバージョンを使用)によってオーバーライドされるようです。したがって、自分で追加する必要はありません。オーバーライドされると、_jsr311-api.jar
_が残るようです。したがって、それを除外すると、誰もそれを使用しようとすることはできません。これが現在の問題のように見えます
_<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>
_
jersey-json
1.9を使用していますが、これはjersey-core
に依存していますが、javax.ws.rs.core.Application
クラスにも依存しています。
したがって、修正は、jersey-json
からjersey-coreを除外することです。
<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>
古いバージョンのJerseyには「public Map getProperties()」メソッドがなかったため、問題は「com.Sun.jersey:jersey-core:jar:1.18.3」(または任意の1. *バージョン)に関連しています。
そして、依存関係の1つはJerseyバージョン1を使用します(mvndependency:treeを実行して確認し、使用されているすべてのjersey-coreバージョンを検索できます)
私は、com.Sun.jerseyのすべての依存関係(古いAPI)を削除し、新しいorg.glassfish.jersey APIを使用する問題を解決しました
https://mvnrepository.com/artifact/org.glassfish.jersey.core