我有一个大型常春藤项目,并且我注意到我的代码在eclipse中运行良好,在ant中运行时会导致编译错误。我把问题缩小到以下几行:
FileUtils.write(...).
此行失败 - 在编译期间 - 根本找不到该方法。显然,我的代码依赖于apache的commons-io库。而且很明显,目前的commons-io有这种方法。
http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html
那是什么?
我很确定这与我的ivy.xml有关 - > eclipse编译器幸运地(或巧妙地)使用最新版本的commons-io,而我的ivy.xml使用的是缺少此方法的旧版本。
最重要的是,蚂蚁显然正在使用这个jar的不同版本。
所以 - 我的问题是:
1)如何告诉ant / ivy优先使用我指定的最新版本的库编译我的代码?我假设我的lib /中的某些依赖项可能依赖于较旧版本的commons-io .....
另外:
2)在这种情况下,任何有关如何担心类加载器如何处理多罐依赖项目中的重复项的提示对我来说也会有所帮助......
答案 0 :(得分:3)
我建议您首先使用report task将常春藤依赖关系报告的生成添加到您的构建中。
此任务的一个示例包含在以下答案中:
What is the Ivy equivalent of Maven's versions:display-dependency-updates?
这将告诉您正在使用什么版本的罐子。通常,常春藤将使用您在 ivy.xml 文件中指定的版本,但是,另一个模块可能依赖于更新版本。 Ivy的默认行为是始终支持最新版本的Maven模块。
如果您希望ivy始终更喜欢特定库的最新版本,请按以下方式声明依赖项:
<dependency org="commons-io" name="commons-io" rev="latest.release"/>
答案 1 :(得分:1)
Ivy有一个名为Fixed and Dynamic Revisions的功能。 您可以将任何工件的版本/修订版设置为最新版本 - status,如
rev="latest.integration" --> for development released
rev="latest.release" --> for released versions
Ivy采用版本最高的版本(你已经指定)并省略了所有版本较低的库,因此在常春藤类路径中只有一个库(查看解析报告,运行ant -v(详细)模式))。,避免了具有冲突版本的重复罐子 这可能值得一试,也许你只需要在你的一个常春藤文件中定义一个旧版本。
类加载器接受类,它恰好是类路径中的第一个(或者是类路径中第一个的jar)。因此,相同lib的混合版本在任何系统上的行为都可能不同,具体取决于类路径的构造方式。