2011-12-04 48 views
1

相关: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。

btw。快速搜索后,似乎人们建议OSGI和类加载器,但我知道它应该是最快的方式来处理它? (已经读了一些关于classloader的内容,但仍不确定如何使用它)。

编辑:我更喜欢使用原始库他们打包,因为我已经分别评估这两个jar(他们是文本挖掘工具具有相同的后端,但版本是非常不同的)。现在我想将它们两个整合为一个,并尽可能地使环境接近原始。 现在我按照Travis Webb的解决方案,但我仍然想知道为什么jar不分开这两个库。

+0

相关问题:http://stackoverflow.com/questions/274317/mixing-different-versions-of-java-libraries –

回答

3

最快方式:

提取a.jar,删除你不想要的东西,并重新罐子它。一个JAR是相同的到一个zip文件,这意味着你可以创建一个普通的zip文件并将其重命名为.jar

顺便说一句,这不是你的错。无论你从哪个罐子获得这些罐子,都是白痴,因为它们包含外部依赖关系,并且他们不应该这样做。

+0

谢谢,我试过你的解决方案,它的工作虽然有点不同于我的原始目标(分开他们的环境)。顺便说一句。这些程序是从生物医学领域产生的,正常的软件实践是不存在的。 –

+0

我认为我们应该努力通过确保它只符合我们的利益来验证罐子。 – sskumar86