web-dev-qa-db-ja.com

Java Jerseyアプリでの起動時のNoSuchMethodError

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)
26
SGr

注:詳細な説明とヒントについては、上記のコメントを参照してください。

このエラーは通常、クラスパスに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>
_
65
Paul Samsotha

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>
0
LeOn - Han Li

古いバージョンの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

0
Walterwhites