簡體   English   中英

在 Java Jersey 應用程序中啟動時出現 NoSuchMethodError

[英]NoSuchMethodError on startup in Java Jersey app

嘗試在 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,那么就有一個javax.ws.rs.core.Application在每個jar中。 但是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>

問題與“com.sun.jersey:jersey-core:jar:1.18.3”(或任何1. *版本)有關,因為舊版本的Jersey沒有“public Map getProperties()”方法。

並且您的一個依賴項使用Jersey版本1(您可以檢查運行mvn依賴項:樹並搜索所有使用的jersey-core版本)

我已經解決了刪除所有com.sun.jersey dependancies(舊api)並使用新的org.glassfish.jersey API的問題

https://mvnrepository.com/artifact/org.glassfish.jersey.core

回復 Koshan Imanga 將 tomcat 版本更改為 7 的回答。我現在在進行 Tomcat 遷移工作時面臨同樣的問題,我們正在將基於 REST API 的應用程序從 Tomcat 7.x 遷移到 Tomcat 9.x。 看到這個錯誤發生在 TC-9 上而不是 TC-7 上,這很奇怪。 應用程序代碼在 Tomcat-7 中運行良好。 如果 jersey 1.x jar 是問題,那么它也應該在 Tomcat 7 中拋出這個錯誤。 誰能告訴我為什么它在 TC 7 中有效?

您可以將tomcat版本更改為7然后它將不需要更改pom.xml

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM