【问题标题】:How to manage library conflict? (same package, different version)如何管理库冲突? (相同的包,不同的版本)
【发布时间】:2012-01-12 10:24:07
【问题描述】:

相关:manage conflict on java classpath

也相关:Java Classloader - how to reference different versions of a jar

我有两个 jar 文件,每个文件都有自己的依赖项包含在 jar 文件中,但它们的版本不同。

a.jar -> has c.class/c2.class/c3.class/.. version 0.3 in it

b.jar -> has c.class/c2.class/c3.class/.. version 1.0 in it

但是当我尝试在同一个项目中同时使用它们时。似乎它只使用一个罐子中的 c.class 而不是另一个罐子。事实证明这是一个问题,因为两个版本的 API 都非常不同。有没有办法告诉他们只从其各自的 jar 中使用 c.class ?我不能在这里修改 a.jar 和 b.jar。

顺便说一句。快速搜索后,似乎人们建议使用 OSGI 和类加载器,但我对此几乎一无所知,这应该是处理它的最快方法吗? (已经阅读了一些关于类加载器的内容,但仍然不知道如何使用它)。

编辑:我更喜欢使用它们捆绑的原始库,因为我已经分别评估了这两个 jar(它们是具有相同后端的文本挖掘工具,但版本非常不同)。现在我想把两者合二为一,尽量让环境接近原始。 现在我遵循 Travis Webb 的解决方案,但我仍然想知道为什么 jar 不分离两组库。

【问题讨论】:

标签: java dependencies classpath


【解决方案1】:

最快的方法:

解压a.jar,删除不需要的东西,然后重新打包。 JAR 与 zip 文件相同,这意味着您可以创建一个普通的 zip 文件并将其重命名为 .jar

顺便说一句,这不是你的错。无论你从谁那里得到这些 jar 都是白痴,因为他们在他们的版本中包含了外部依赖项,他们不应该这样做。

【讨论】:

  • 谢谢,我尝试了您的解决方案,虽然与我最初的目标(分离他们的环境)有很大不同,但它确实有效。顺便提一句。这些程序是从生物医学领域衍生出来的,在该领域,正常的软件实践几乎不存在。
  • 我认为我们应该足够勤奋地交叉验证罐子,确保它只符合我们的利益。
猜你喜欢
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2023-04-03
  • 2013-04-01
  • 2021-03-14
  • 2017-02-28
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多