繁体   English   中英

混合不同版本的Java库

[英]Mixing different versions of Java libraries

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

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

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

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

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

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

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

JarJar来救援!

一个蚂蚁,1)将许多罐装入一个,2)允许您重命名类文件中的依赖项,从而加载同一个库的两个版本!

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM