混合不同版本的Java库

我的项目使用具有自己的依赖项的Java库(例如Hadoop,Jetty)。 我最终得到了相同依赖项的不同版本,比如ant 1.4.5,1.4.6。 我的项目可能想使用ant 1.4.7。 这是一个小例子,可以通过HTTP Commons等更大的依赖关系变得更复杂。

如何让所有库和依赖项都发挥得淋漓尽致? 有没有办法隔离每个库(Hadoop,Jetty),以便它们只使用它们的依赖项?

Maven通常也能很好地处理这个问题。 如果不完全,它将至少处理它的大部分,然后你可以解决剩下的问题。

当然,这意味着你必须改变你的构建过程,但是不要因为没有把头发拉出来而值得花时间。

JarJar来救援!

一个ant,1)包装许多jar子,2)允许您重命名类文件中的依赖项,从而加载同一个库的两个版本!

您可以选择使用依赖性管理框架(如OSGI)来管理所有这些。 看一下spring框架动态模块http://www.springsource.org/osgi

您还可以查看Eclipse实现OSGI的框架部分。 看看这里http://www.eclipse.org/osgi/

简短的回答就是寻求最低的共同点。 请记住,’endorsed’目录是您的朋友 – 在管理冲突的依赖项时。

如果您有源代码,请将所有内容编译在一起。 如果不这样做,遗憾的是,您必须使用目标选项将最小公分母定位到javac。 如果在运行应用程序时遇到实际问题,您只需执行此操作,只要jvm是当前版本(Java对于与旧版本的二进制兼容性非常严格),就很少应该这样做。

JG提到了OSGi,这是我在阅读这个问题时的第一个想法。

拥有相同库的多个版本是OSGi的一个重点。 如果我们已经提到了一些第三方产品,我认为公平地提及它背后的规范。

您可以从官方osgi网站http://osgi.org获取