Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用大量FOSS/COTS处理多个jar版本?_Java_Ant_Build_Build Process_Classpath - Fatal编程技术网

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

Java 如何使用大量FOSS/COTS处理多个jar版本?,java,ant,build,build-process,classpath,Java,Ant,Build,Build Process,Classpath,我们有一个Java产品,它使用了很多FOSS/COTS软件。我们的许多外部程序使用相同的jar产品,但版本不同。例如,Ant 1.6.5和Ant 1.7.0;或xerces的多个版本。我担心的是,如果我们改变类路径的组合顺序,应用程序的行为可能会改变,甚至更糟,epic会失败。我们使用vbs脚本为每个产品的类路径设置环境变量,然后使用引用这些环境变量的Ant xml文件 所以,有几个问题: 当使用这么多不同的外部时,如何管理同一jar的多个版本?当然,我不能仅仅找到所有独特的jar并将它们放在一

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

所以,有几个问题:

当使用这么多不同的外部时,如何管理同一jar的多个版本?当然,我不能仅仅找到所有独特的jar并将它们放在一个大的类路径上——或者我可以吗? 有没有更聪明的方法将构建依赖项和类路径放在一起? 一个积极的步骤是,我计划使用通配符来获取所有jar。但我最关心的其实只是进口订单问题


注意:不要向信使开枪。这个系统是几年前建立起来的,在我来这里之前很久。我只是清理工人。

马文。需要一段时间来弄清楚它,并把它设置好,但一旦它工作起来,它是相当神奇的


请参见

Maven。需要一段时间来弄清楚它,并把它设置好,但一旦它工作起来,它是相当神奇的

请参见

您可以添加到ant构建中,以明确版本依赖关系。在构建类路径时,我建议您尽量避免使用同一个库的多个版本。我们有一些非常恼人的行为,IDE将使用可传递依赖项构建类路径,但我们按字母顺序构建unix类路径,这导致根据代码的运行位置加载Saxon/Xalan JavaMail/Genronimo JavaMail中的一个

正如在另一个答案中提到的,如果您有时间重新构建系统,您应该看看maven

我非常喜欢John Smart关于维护构建环境的这篇文章

您可以添加到ant构建中以明确版本依赖关系。在构建类路径时,我建议您尽量避免使用同一个库的多个版本。我们有一些非常恼人的行为,IDE将使用可传递依赖项构建类路径,但我们按字母顺序构建unix类路径,这导致根据代码的运行位置加载Saxon/Xalan JavaMail/Genronimo JavaMail中的一个

正如在另一个答案中提到的,如果您有时间重新构建系统,您应该看看maven


我非常喜欢John Smart关于维护构建环境的这篇文章

如果必须将所有JAR放在同一个类装入器中,那么可以使用maven来确定依赖项集。这将选择依赖项集所需的每个库的最新版本。例如,将选择Ant 1.7.0,而不是1.6.5。此方案运行良好-除非库与早期版本不向后兼容。因此,在更改依赖项时,最好测试应用程序的相关功能


另一种方法是将接口加载到公共类加载器中,将实现+依赖项加载到自定义类加载器中,这种方法仅在库可以分为接口和实现的情况下才可行。这通过给每个依赖项自己的类加载器来隔离它们。这基本上就是OSGi所做的。

如果必须将所有JAR放在同一个类装入器中,那么可以使用maven来确定依赖项集。这将选择依赖项集所需的每个库的最新版本。例如,将选择Ant 1.7.0,而不是1.6.5。此方案运行良好-除非库与早期版本不向后兼容。因此,在更改依赖项时,最好测试应用程序的相关功能


另一种方法是将接口加载到公共类加载器中,将实现+依赖项加载到自定义类加载器中,这种方法仅在库可以分为接口和实现的情况下才可行。这通过给每个依赖项自己的类加载器来隔离它们。这基本上就是OSGi所做的。

这就是OSGi设计用来解决的问题:在应用程序中有相同JAR的多个独立版本。

这就是OSGi设计用来解决的问题:在应用程序中有相同JAR的多个独立版本。

我不确定使用Maven或Ivy的建议是否会奏效解决真正的问题。它们可能会清理依赖项声明,但不会对冲突做任何处理。如果您需要提供同一库的两个不同版本,因为如果库不向后兼容,则使用最新版本不一定有效,您可以使用重新打包库

使用不同的包名,以便在必要时可以加载两个版本。

我不确定使用Maven或Ivy的建议是否能解决实际问题。它们可能会清理依赖项声明,但不会对冲突做任何处理。如果您需要提供同一库的两个不同版本,因为如果库不向后兼容,则使用最新版本不一定有效,您可以使用重新打包具有不同包名的库,以便在必要时可以加载这两个版本。

您能给我指一下TFM,它解释了如何使用Maven来确定依赖项集吗?抱歉,我只是一个完整的Maven noob。Maven会自动完成这项工作,它被称为依赖解析。有各种各样的插件可以将代码与依赖项打包在一起,比如war插件。您可以使用依赖插件显式复制依赖项。好消息。非常感谢!你能给我指一下TFM,它解释了如何使用Maven来确定依赖项集吗?抱歉,我只是一个完整的Maven noob。Maven会自动完成这项工作,它被称为依赖解析。有各种各样的插件可以将代码与依赖项打包在一起,比如war插件。您可以使用依赖插件显式复制依赖项。好消息。非常感谢!像这样重新打包jar会破坏许可协议吗?我不想毛毛跟在我们后面。还必须向法律部门解释这一点。@Dopyii我不知道商业JAR的情况,但修改Apache/BSD许可的开放源码不应该有任何问题。像这样重新打包JAR会破坏许可协议吗?我不想毛毛跟在我们后面。还可能需要向法律部门解释。@Dopyii我不知道商业JAR的情况,但修改Apache/BSD许可的开放源码不应该有任何问题。听起来Maven将是最好的解决方案。若我们还并没有达到这个产品的生命周期,我会马上加入。我不知道我是否能证明在这一点上完全转换是正确的。但是,也许我可以深入研究,让它成为下次简历的建设者;谢谢开始在maven中添加新东西,5年后,当您的生命周期结束产品仍在使用时,您将能够非常快速地转换它:听起来maven将是最好的解决方案。若我们还并没有达到这个产品的生命周期,我会马上加入。我不知道我是否能证明在这一点上完全转换是正确的。但是,也许我可以深入研究,让它成为下次简历的建设者;谢谢开始在maven中添加新东西,5年后,当您的生命周期结束产品仍在使用时,您将能够非常快速地转换它:这一句话可能是完全正确的。然而,这并不能帮助该领域的初学者了解从哪个方向开始。我的意思是,你不希望原始海报开始阅读所有OSGI规范,对吧?那么也许你有一个更详细的指针?那一句话可能是完全正确的。然而,这并不能帮助该领域的初学者了解从哪个方向开始。我的意思是,你不希望原始海报开始阅读所有OSGI规范,对吧?也许你有一个更详细的指针?