2

我有一个大型 Ivy 项目,我注意到我的代码在 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 使用的是缺少此方法的旧版本。

最重要的是,ant 显然使用的是这个 jar 的不同版本。

所以 - 我的问题是:

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

还 :

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

4

2 回答 2

3

依赖性报告

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

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

Maven 版本的 Ivy 等价物是什么:display-dependency-updates?

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

检索最新的依赖项

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

<dependency org="commons-io" name="commons-io" rev="latest.release"/>
于 2012-03-20T19:41:19.127 回答
1

Ivy 有一个称为Fixed and Dynamic Revisions的功能。您可以将任何工件的版本/修订设置为最新状态,例如

rev="latest.integration" --> for development released
rev="latest.release" --> for released versions

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

至于第二点:

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

于 2012-03-20T15:46:45.167 回答