你如何使用大量的FOSS / COTS处理多个jar版本?

时间:2010-08-19 15:48:15

标签: java ant build build-process classpath

我们有一个使用大量FOSS / COTS软件的Java产品。我们的许多“外部”使用相同的jar产品,但使用的是不同的版本。例如,Ant 1.6.5和Ant 1.7.0;或多个版本的xerces。我关心的是我们的应用程序的行为可能会改变或更糟,如果我们改变类路径放在一起的顺序,史诗会失败。我们使用vbs脚本为每个产品的类路径设置环境变量,然后使用引用这些环境变量的Ant xml文件。

所以,有几个问题:

  1. 使用这么多不同的外部时,如何管理同一个jar的多个版本?当然,我不能只找到所有独特的罐子并将它们放在一个大的路径上 - 或者我可以吗?
  2. 是否有更智能的方法将构建依赖项(和类路径)放在一起?
  3. 一个积极的步骤是我计划使用通配符来抓住所有的罐子。但这实际上只是我最关心的导入订单问题。

    注意:不要射击信使。几年前,这个系统在我到达之前就已经实施了。我只是个清理工作者。

5 个答案:

答案 0 :(得分:5)

的Maven。需要一段时间来弄清楚它并将其设置好,但一旦它正常工作它就会非常神奇。

请参阅http://maven.apache.org/download.html

答案 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的多个独立版本。