我有一个带有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.1
,azure-serviceruntime
包含jersey-core:1.13
,其中包含Application
包中的javax.ws.rs.core
类。
在Eclipse中搜索Application
类型显示以下内容(以澄清):
问题是在运行时使用了错误的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
类?
答案 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>