我们有一个使用大量FOSS / COTS软件的Java产品。我们的许多“外部”使用相同的jar产品,但使用的是不同的版本。例如,Ant 1.6.5和Ant 1.7.0;或多个版本的xerces。我关心的是我们的应用程序的行为可能会改变或更糟,如果我们改变类路径放在一起的顺序,史诗会失败。我们使用vbs脚本为每个产品的类路径设置环境变量,然后使用引用这些环境变量的Ant xml文件。
所以,有几个问题:
一个积极的步骤是我计划使用通配符来抓住所有的罐子。但这实际上只是我最关心的导入订单问题。
注意:不要射击信使。几年前,这个系统在我到达之前就已经实施了。我只是个清理工作者。
答案 0 :(得分:5)
的Maven。需要一段时间来弄清楚它并将其设置好,但一旦它正常工作它就会非常神奇。
答案 1 :(得分:2)
如果必须将所有jar放在同一个类加载器中,那么可以使用maven来确定依赖关系集。这将选择一组依赖项所需的每个库的最新版本。 (例如,将选择Ant 1.7.0,而不是1.6.5。)此方案运行良好 - 除非库不向后兼容早期版本。因此,在更改依赖关系时测试应用程序的相关功能/功能是个好主意。
另一种方法是,只有将库拆分为接口和实现,才能将接口加载到公共类加载器中,并在自定义类加载器中加载实现+依赖项。这通过赋予它自己的类加载器来隔离每个依赖项。这基本上就是OSGi所做的。
答案 2 :(得分:1)
您可以将Ivy添加到您的ant构建中以显式版本依赖项。在构建类路径时,我建议您努力解决您没有同一个库的多个版本的情况。我们有一些非常烦人的行为,IDE会使用传递依赖构建类路径,但我们按字母顺序构建我们的unix类路径,导致Saxon / Xalan JavaMail / Genronimo-JavaMail中的一个被加载,具体取决于您运行代码的位置。
正如另一个答案中所提到的,如果你有时间重新构建你的构建系统,你应该看看maven。
我非常喜欢John Smart关于维护构建环境的talk
答案 3 :(得分:1)
我不确定使用Maven或Ivy的建议能解决实际问题。他们可能会清除依赖关系的声明,但他们不会对冲突做任何事情。如果您需要发送同一个库的两个不同版本(因为如果库不向后兼容,使用最新版本不一定有效),您可以使用jarjar重新打包库使用不同的包名称,以便在必要时可以加载这两个版本。
答案 4 :(得分:0)
这就是OSGi旨在解决的问题:在您的应用程序中拥有相同jar的多个独立版本。