Spring Jersey - java.lang.NoSuchMethodError:javax.ws.rs.core.Application.getProperties()Ljava / util / Map

时间:2016-08-29 20:41:59

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

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

<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 - &gt; settings.xml配置添加对新repo的引用,如下所示:

<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应用程序的原因?

2 个答案:

答案 0 :(得分: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()方法。

答案 1 :(得分:0)

虽然有不同的依赖项,但我有相同的异常:

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

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

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