Maven依赖项在运行时选择了错误的Jersey类

时间:2017-08-07 22:21:49

标签: java maven jersey

我有一个带有Maven和Tomcat的Java Servlet项目,它包含以下两个依赖项(以及许多其他项):

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.25.1</version>
</dependency>
<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-serviceruntime</artifactId>
    <version>0.6.0</version>
</dependency>

jersey-server包括javax.ws.rs-api:2.0.1azure-serviceruntime包含jersey-core:1.13,其中包含Application包中的javax.ws.rs.core类。

在Eclipse中搜索Application类型显示以下内容(以澄清): The two Application classes

问题是在运行时使用了错误的Application类,这会在启动Tomcat时导致以下错误:

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

对于每个servlet。

我尝试从jersey-core中排除azure-serviceruntime,但是servlet似乎根本没有加载。我还尝试添加javax.ws.rs-api作为直接依赖,但也没有用。最无法解释的部分是它可以在Windows上运行但在Linux上运行... 我也尝试用maven shade重新定位类/包但没有任何成功。

如何告诉Java使用最新的Application类?

2 个答案:

答案 0 :(得分:1)

我终于开始工作了。我进一步研究了它在Windows而不是Linux上工作的事实,区别在于我在Windows上使用OracleJDK而在Linux上使用openJDK。

所以我在Linux上使用OracleJDK作为我的项目,现在它可以工作了。

答案 1 :(得分:0)

我认为最好的办法是使用dependency exclusion从azure-serviceruntime依赖项中排除 jersey-core:1.13

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.25.1</version>
</dependency>
<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-serviceruntime</artifactId>
    <version>0.6.0</version>
      <exclusions>
        <exclusion>
          <groupId>org.glassfish.jersey.core</groupId>
          <artifactId>jersey-core</artifactId>
        </exclusion>
      </exclusions>
</dependency>