运行我的项目时出现java.lang.NoClassDefFoundError错误

时间:2014-05-07 15:12:31

标签: java maven jax-ws jax-rs jersey-client

我一直在努力让这个工作,我想我可以使用一些帮助。我正在开发一个Java项目,其中pom.xml有一堆依赖项,其中一些依赖于这个jar: com.sun.jersey:jersey-core:1.17.1喜欢这样:

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.0.1</version>
</dependency>

我需要在我的pom中使用这个特殊的jar,因为我想使用jax-rs api中的新功能: javax.ws.rs:javax.ws.rs-api:2.0。问题是当我构建项目时出现此错误:

Found duplicate classes in [com.sun.jersey:jersey-core:1.17.1,javax.ws.rs:javax.ws.rs-api:2.0] :
[WARNING]   javax.ws.rs.ApplicationPath
[WARNING]   javax.ws.rs.Consumes
[WARNING]   javax.ws.rs.CookieParam 
[WARNING]   javax.ws.rs.DELETE
[WARNING]   javax.ws.rs.DefaultValue
[WARNING]   javax.ws.rs.Encoded
[WARNING]   javax.ws.rs.FormParam
[WARNING]   javax.ws.rs.GET
[WARNING]   javax.ws.rs.HEAD
[WARNING]   javax.ws.rs.HeaderParam
...
..

我试图通过检查依赖树来从包含它的依赖项中排除com.sun.jersey:jersey-core:1.17.1来解决这个问题。

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>1.0.1</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
    </exclusion>
  </exclusions>
</dependency> 

现在项目构建正常,但是当我尝试运行它时,我收到此错误:

    java.lang.NoClassDefFoundError: com/sun/jersey/core/util/FeaturesAndProperties
at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.7.0_51]
at java.lang.Class.privateGetDeclaredMethods(Class.java:2531) ~[na:1.7.0_51]
at java.lang.Class.getDeclaredMethods(Class.java:1855) ~[na:1.7.0_51]
at com.google.inject.internal.ProviderMethodsModule.getProviderMethods
    (ProviderMethodsModule.java:81) ~[guice-3.0.jar:na]
at com.google.inject.internal.ProviderMethodsModule.configure
    (ProviderMethodsModule.java:73) ~[guice-3.0.jar:na]
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223) 
    ~[guice-3.0.jar:na]
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:232)
    ~[guice-3.0.jar:na]
at com.google.inject.spi.Elements.getElements(Elements.java:101) ~[guice-3.0.jar:na]
at com.google.inject.spi.Elements.getElements(Elements.java:92) ~[guice-3.0.jar:na]

看起来需要球衣核心,但我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:7)

您无法混合JAX-RS / Jersey个版本

  • Jersey版本 1 是JAX-RS 1的参考实现。Jersey版本 1 使用{{1} } group / package prefix。

  • com.sun.jersey 2 是JAX-RS 2的参考实现。Jersey版本 2 使用{{1} } group / package前缀

如果您的类路径中同时具有Jersey版本或两个JAX-RS版本,则会获得大量Jerseyorg.glassfish.jersey或类似版本。

如果可能,请使用NoClassDefFoundError / NoSuchMethodError第2版

答案 1 :(得分:1)

对我而言,这实际上意味着我在某种程度上混合了一些东西而且正在使用

$ mvn dependency:list | grep jersey
[INFO]    com.sun.jersey:jersey-client:jar:1.11:compile
[INFO]    com.sun.jersey:jersey-core:jar:1.0.2:compile

(球衣1.x内的冲突)

答案 2 :(得分:0)

Jersey是JAX-RS的参考实现,所以你不需要最新版本的JAX-RS API(javax.ws.rs:javax.ws.rs-api:2.0),但最新版本的Jersey是2.8(见{{3 }})。