【问题标题】:Runnable JAR with duplicate dependencies具有重复依赖项的可运行 JAR
【发布时间】:2025-12-29 23:30:11
【问题描述】:

我正在尝试使用 Eclipse 创建一个可运行的 JAR,但遇到了问题。 Eclipse 工作区包含两个独立的项目,它们依赖于同一个库。我可以创建可运行的 JAR,但问题是当我运行它时收到 java.lang.NoSuchMethodError 异常。

我相信我收到了java.lang.NoSuchMethodError 异常,因为libraries are different versions。有解决此问题的通用解决方案吗?如果没有,你会建议我做什么?

【问题讨论】:

  • 我明白你的意思是“依赖同一个库的不同版本”?
  • 是的,项目 A 依赖于 lib-1.0 而项目 B 依赖于 lib-2.0。此外,项目 A 依赖于项目 B

标签: java jar dependencies executable-jar


【解决方案1】:

如果主要版本号更改,则意味着向后兼容性可能已更改。

您可以尝试使用最新版本并希望他们只是添加了方法和旧的工作方式,但是即使没有抛出 NoSuchMethod 异常也不能保证(也许使用新的 API 您应该调用不同的方法来得到相同的结果)。

我会联系图书馆的提供者并询问他们是否兼容性被破坏。如果他们不回答或者它坏了,而你有源代码,唯一的可能就是重构其中一个库(可能是 1.0); v.g.将所有内容放入新数据包 v1 中。然后你必须改变依赖它的项目。

如果以上都不起作用,那么解决方案将是一个 OSGi 容器,或者将项目 A 和项目 B 设置为两个不同的可执行文件,并将项目 B 设置为响应项目 A 消息的服务器。凌乱

【讨论】:

  • 谢谢。顺便说一句,lib-1.0lib-2.0 不是真正的库;它们只是例子。主要和次要版本号在我的情况下没有意义,但对其他人来说可能是这样。
  • 如果差异在于次要版本号,那么只需使用最后一个数字,您应该是安全的(如果库的提供者做了应该做的事情)。如果区别在于版本号,通常您使用哪一个并不重要(但建议使用最后一个)。
  • 我最终只是更新了我的项目 A 以使用 lib-2.0 库。它确实需要我重构我的一些代码,但幸运的是它并不多。幸运的是,我必须做的更改很小,但如果它们要占用更多时间,我可能会更多地研究 OSGi。感谢您的帮助!
【解决方案2】:

解决方法是只包含一个版本的库,它可以满足使用它的两个库。如果那是不可能的,你将不得不找到一种不同的方式来处理事情,这样你就可以消除冲突。选项包括:

  1. 从您的代码中删除导致 NoSuchMethodError 的一个或多个用途。
  2. 修改一个或多个库的源代码,使它们能够愉快地共存。
  3. 使用 OSGi 容器,这样您就可以在同一个应用程序中拥有同一个库的两个版本。

【讨论】:

    【解决方案3】:

    正如 SJuan 所说,您可以使用 OSGI 来正确设置它。 http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell

    【讨论】:

      最近更新 更多