Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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
在依赖项的海洋中更喜欢最新的jar(java)_Java_Apache_Ant_Ivy_Conflicting Libraries - Fatal编程技术网

在依赖项的海洋中更喜欢最新的jar(java)

在依赖项的海洋中更喜欢最新的jar(java),java,apache,ant,ivy,conflicting-libraries,Java,Apache,Ant,Ivy,Conflicting Libraries,我有一个大型常春藤项目,我注意到我的代码在eclipse中运行良好,在ant中运行时会导致编译错误。我已将问题缩小到以下几行: FileUtils.write(...). 这一行失败-在编译过程中-根本找不到该方法。显然,我的代码依赖于apache的commons io库。很明显,当前的commons io有这种方法 那么是什么呢? 我很确定这与我的ivy.xml有关->eclipse编译器幸运地(或聪明地)使用了最新版本的commons io,而我的ivy.xml使用的是缺少此方法的旧版

我有一个大型常春藤项目,我注意到我的代码在eclipse中运行良好,在ant中运行时会导致编译错误。我已将问题缩小到以下几行:

FileUtils.write(...). 
这一行失败-在编译过程中-根本找不到该方法。显然,我的代码依赖于apache的commons io库。很明显,当前的commons io有这种方法

那么是什么呢?

我很确定这与我的ivy.xml有关->eclipse编译器幸运地(或聪明地)使用了最新版本的commons io,而我的ivy.xml使用的是缺少此方法的旧版本

最重要的一点是,ant显然使用了这个jar的另一个版本

所以-我的问题是:

1) 如何让ant/ivy优先使用我指定的库的最新版本编译代码?我假设lib/中的一些依赖项可能依赖于commons io的旧版本

此外:

2) 在这种情况下,任何关于类加载器如何处理依赖于多jar的项目中的重复项的提示都会对我有所帮助…

Ivy有一个名为。 您可以将任何工件的版本/修订设置为最新版本

Ivy采用最高版本(您已指定)的版本,并省略所有版本较低的库,因此Ivy类路径中只有一个库(请查看解析报告,运行ant-v(详细模式)),这避免了具有冲突版本的重复JAR。
这可能值得一看,也许你只是在一个常春藤文件中定义了一个旧版本

关于第二点: 类加载器获取类,该类恰好位于类路径中的第一个(或者位于类路径中的第一个jar)。因此,同一库的混合版本在任何系统上的行为都可能不同,这取决于类路径的构造方式。 您可以将任何工件的版本/修订设置为最新版本

Ivy采用最高版本(您已指定)的版本,并省略所有版本较低的库,因此Ivy类路径中只有一个库(请查看解析报告,运行ant-v(详细模式)),这避免了具有冲突版本的重复JAR。
这可能值得一看,也许你只是在一个常春藤文件中定义了一个旧版本

关于第二点: 类加载器获取类,该类恰好位于类路径中的第一个(或者位于类路径中的第一个jar)。因此,同一库的混合版本在任何系统上的行为都可能不同,这取决于类路径的构造方式。

依赖关系报告 我建议您首先使用

以下答案中包含了此任务的一个示例:

这将告诉您正在使用哪些JAR的版本。通常,ivy将使用您在ivy.xml文件中指定的版本,但是,另一个模块可能依赖于更新的版本。Ivy的默认行为是总是支持Maven模块的最新版本

检索最新的依赖项 如果希望ivy始终喜欢特定库的最新版本,请按如下方式声明依赖项:

<dependency org="commons-io" name="commons-io" rev="latest.release"/>

依赖项报告 我建议您首先使用

以下答案中包含了此任务的一个示例:

这将告诉您正在使用哪些JAR的版本。通常,ivy将使用您在ivy.xml文件中指定的版本,但是,另一个模块可能依赖于更新的版本。Ivy的默认行为是总是支持Maven模块的最新版本

检索最新的依赖项 如果希望ivy始终喜欢特定库的最新版本,请按如下方式声明依赖项:

<dependency org="commons-io" name="commons-io" rev="latest.release"/>


是否有可能切换到Maven?我知道让Maven总是使用最新版本的依赖项是微不足道的。不过,我想常春藤也有类似的功能。这看起来很有用:@aroth切换到Maven并不总是大型遗留ANT构建的选项。根据我的经验,Maven最适合绿地项目,有没有可能改用Maven?我知道让Maven总是使用最新版本的依赖项是微不足道的。不过,我想常春藤也有类似的功能。这看起来很有用:@aroth切换到Maven并不总是大型遗留ANT构建的选项。根据我的经验,Maven最适合绿地项目