我有一个大型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"/>
rev="latest.integration" --> for development released
rev="latest.release" --> for released versions
Ivy采用最高版本(您已指定)的版本,并省略所有版本较低的库,因此Ivy类路径中只有一个lib(查看解析报告,运行ant-v(详细模式))。,这避免了具有具有冲突版本的重复罐子
这可能值得一看,也许你只是在你的一个ivy文件中定义了一个旧版本。
关于第二点:
类加载器获取类,该类恰好位于类路径中的第一个(或类路径中第一个的jar)。因此,同一lib的混合版本在任何系统上都可能有不同的行为,这取决于类路径的构建方式。