【问题标题】:Spring Jersey - java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/MapSpring Jersey - java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map
【发布时间】:2023-03-06 15:40:02
【问题描述】:

更新:所以我只想指出,在我提交这个问题之前,我尝试了我在类似的 stackoverflow 问题上看到的解决方案,例如this one。它仍然给我运行时错误,所以我决定写这个问题。 mvn dependency:tree 是我一直在寻找的东西,所以谢谢@dunni。使用mvn dependency:tree,我能够找到破坏我的应用程序的球衣依赖项的实际名称,并通过更改排除项来更新排除项:

<exclusions>
    <exclusion>
        <groupId>javax.ws.rs</groupId>
        <artifactId>jsr311-api</artifactId>
    </exclusion>
</exclusions>

收件人:

<exclusions>
    <exclusion>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
    </exclusion>
</exclusions>

现在可以了。


很长一段时间以来,我一直在使用 1 个内部公司存储库来开发这个 Spring Jersey REST 应用程序。现在,我发现我需要使用的库只存在于第二个内部公司存储库中。我更新了我的 .m2 -> settings.xml 配置以添加对新仓库的引用,如下所示:

<settings>
    <mirrors>
        <mirror>
            <id>internal-repository1</id>
            <name>name</name>
            <url>http://repo1.company.com/repositories/</url>
            <mirrorOf>*, !repo2</mirrorOf>
        </mirror>
    </mirrors>  
    <profiles>
        <profile>
            <id>profile</id>
            <repositories>
                <repository>
                    <id>repo1</id>
                    <name>repo1</name>
                    <url>http://repo1.company.com/repositories/</url>
                </repository>
                <repository>
                    <id>repo2</id>
                    <name>repo2</name>
                    <url>http://repo2.company.com/respositories/</url>
                </repository>
            </repositories>
        </profile>                
    </profiles>

    <activeProfiles>
        <activeProfile>profile</activeProfile>
    </activeProfiles>
</settings>

这行得通。我可以在 System.out 中看到它尝试从 repo1.company.com/repositories/ 下载 repo2 独占依赖项。它失败了,然后它尝试从 repo2.company.com/repositories 下载它并成功。构建继续,最终 tomcat 在 localhost:8080 上启动,一切都很好。

问题是,每当我尝试访问我设置的任何 Jersey REST 端点时,都会收到问题标题中提到的运行时错误:

ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[my.package.name] 
- Allocate exception for servlet my.package.name.JerseyConfig
java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;

我知道问题出在我尝试使用的这个新依赖项的某个地方。当我注释掉 pom.xml 中的依赖项并重新运行应用程序时,一切正常。所有 REST 端点都可以正常工作。取消注释依赖,重新运行应用程序,并尝试访问我的 REST 端点,我得到了上述错误。

我该如何找出为什么这种依赖关系会在运行时破坏我的 Jersey 应用程序?

【问题讨论】:

  • 你的依赖版本很可能有冲突。运行mvn dependency:tree 并在此处发布输出。
  • 谢谢@dunni。我的问题是如何我去找出它为什么会给我运行时错误,而mvn dependency:tree 正是我正在寻找的。更新了&lt;exclusion&gt;&lt;/exclusion&gt;,现在我的应用程序似乎运行良好。还更新了我的问题以显示我是如何解决问题的。

标签: maven spring-boot jersey maven-3 jersey-2.0


【解决方案1】:

我得到了相同的异常,尽管它是在不同的依赖项上:

我要更改我的 sql 驱动程序版本:

<dependency>
  <groupId>com.microsoft.sqlserver</groupId>
  <artifactId>mssql-jdbc</artifactId>
  <version>6.2.2.jre8</version>
</dependency>

之前,我使用的是 6.1.0.jre8 版本。 Here我知道了。

【讨论】:

    【解决方案2】:

    通过看到错误我可以猜测 jar 文件中存在一些冲突 请检查类路径上是否同时具有 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 应用程序没有 getProperties() 方法。

    【讨论】:

    • 所以我回去检查(根据@dunni 的建议运行 mvn dependency:tree)。我没有准确找到jsr311-api,但我发现它与com.sun.jersey:jersey-client 有依赖关系。因此,我将其添加为 pom.xml 中依赖项的排除项,现在它似乎工作正常。
    • 尽管这并不能完全回答我的问题,但我仍会将其标记为正确答案,因为它确实帮助我找到了答案。
    • 仅供参考,jersey-core 在 v1.19 之前的 .jar 中包含了 jsr311-api 的副本。尽管在您的 pom.xml 文件中添加了排除项,但使用或依赖之前版本的任何人都可能会遇到此问题。
    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多