我的项目使用具有自己的依赖项的Java库(例如Hadoop,Jetty)。我最终得到了相同依赖项的不同版本,比如ant 1.4.5,1.4.6。我的项目可能想要使用ant 1.4.7。这是一个小例子,可以通过HTTP Commons等更大的依赖关系变得更复杂。
如何让所有库和依赖项都发挥得更好?有没有办法隔离每个库(Hadoop,Jetty),以便它们只使用它们的依赖项?
答案 0 :(得分:2)
您可以选择使用依赖性管理框架(如OSGI)管理所有这些内容。看一下spring框架动态模块http://www.springsource.org/osgi
您还可以查看Eclipse实现OSGI的框架部分。看看http://www.eclipse.org/osgi/
简短的回答就是寻求最低的共同点。请记住,'endorsed'目录是您的朋友 - 在管理冲突的依赖项时。
答案 1 :(得分:2)
Maven通常也能很好地处理这个问题。如果不完全,它将至少处理它的大部分,然后你可以解决遗留的问题。
当然,这意味着你必须改变你的构建过程,但是不要因为没有把头发拉出来而值得花时间。
答案 2 :(得分:2)
JarJar救援!
一个ant任务,1)将许多jar包装成一个,2)允许你重命名类文件中的依赖项,从而加载同一个库的两个版本!
答案 3 :(得分:1)
如果您有源代码,请将所有内容编译在一起。如果不这样做,遗憾的是,您必须使用目标选项将最低公分母的源定位到javac。如果在运行应用程序时遇到实际问题,则只需执行此操作,只要jvm是当前版本(Java对旧版本的二进制兼容性非常严格),就很少这样做。
答案 4 :(得分:0)
J G提到了OSGi,这是我在阅读这个问题时的第一个想法。
拥有相同库的多个版本是OSGi的一个重点。 如果我们已经提到了一些第三方产品,我认为公平地提及它背后的规范。
您可以从官方osgi网站http://osgi.org
获取