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



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

FileUtils.write(...). 

这一行失败了——在编译过程中——根本找不到该方法。显然,我的代码依赖于apache的commons-io库。很明显,目前的公地io有这种方法。

http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html

那是什么呢

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

最重要的是,蚂蚁显然使用了这个罐子的不同版本。

所以-我的问题是:

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

还有:

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

依赖关系报告

我建议您首先使用报告任务将ivy依赖关系报告的生成添加到构建中。

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

什么是Ivy的Maven';s版本:显示依赖项更新?

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

检索最新的依赖项

如果您希望ivy始终喜欢特定库的最新版本,则声明依赖项如下:

<dependency org="commons-io" name="commons-io" rev="latest.release"/>
Ivy有一个名为"固定和动态修订"的功能。您可以将任何工件的版本/修订设置为最新状态,如
rev="latest.integration" --> for development released
rev="latest.release" --> for released versions

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

关于第二点:

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

相关内容

  • 没有找到相关文章

最新更新