【问题标题】:NoClassDefFoundError due to different version of jarsNoClassDefFoundError 由于不同版本的 jars
【发布时间】:2016-08-23 06:38:08
【问题描述】:

我正在开发使用一些 common-collection jar 和 v3.2.1 版本的 maven 产品,该产品是从我们的存储库下载的。在整个项目中,我们使用的是ver1.1。现在我必须使用在 v3.2.2 中使用 common-collection 的第三方 jar,因此我得到了 NoClassDefFound 异常。

线程“主”java.lang.NoClassDefFoundError 中的异常: org/apache/commons/collections/map/ReferenceMap

我无法更改项目中的版本。如何解决这个问题?

【问题讨论】:

  • 在将其设置为您的依赖项时,您是否尝试从新的第三方依赖项中排除 commons-collections?
  • 参见stackoverflow.com/questions/24962607/…(配置文件和范围)。
  • 看看这个:stackoverflow.com/questions/27147660/…>
  • 请查看:stackoverflow.com/questions/27147660/…>
  • stackoverflow.com/questions/27147660/…>

标签: java maven exception pom.xml


【解决方案1】:
  1. 我无法更改项目中的版本,即 v1.1

  2. 现在我必须使用第三方 jar,它使用 v3.2.2 的 common-collection

你很难做出选择。要么更改(升级)项目中的版本,要么不使用 3rd-party 库。 (这假设第 3 方库的依赖是一个困难的......如果 API 类已被移动,这似乎很可能,等等。)

第一种选择可能更好。使用过时版本的 commons-collection 库的时间越长,遇到的此类问题就越多。


其实还有第三种可能,不过是自找麻烦。您可以尝试构建自己的与 v1.1 和 v3.2.2 兼容的 commons-collection 版本。但问题来了:

  • 只要您在代码库中需要它,您就需要花费额外的工作来维护这个自定义版本的 commons-collection。 (如果您的代码版本是长期存在的;例如,如果它们发布给有长期支持需求的客户。)

  • 它可能不起作用。假设代码的一部分在一个包中需要ReferenceMap,而另一部分在另一个包中需要它。


另一种可能性(另一个坏主意!)可能是用类加载器做一些棘手的事情,但这也可能导致问题。如果同一类的两个版本被不同的类加载器加载到应用程序中,类型系统将坚持认为它们是不同的类型。它们不会与分配兼容。类型转换会意外失败,等等。

【讨论】:

    【解决方案2】:

    好像已经移到了

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-collections4</artifactId>
        <version>4.1</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多