【问题标题】:Ivy - Specifying compile/runtime classpath with IvyIvy - 使用 Ivy 指定编译/运行时类路径
【发布时间】:2023-03-13 06:10:02
【问题描述】:

我有一个项目,它有两个不同的 jar,它们都包含一些相同的类。我需要的是它在 Jar “B” 之前使用 Jar “A” 中的类。在普通的 Java 编译中(以及使用 Ant),我可以指定类路径本身的顺序。这样,我可以保证 Jar “A” 中的类将在 Jar “B” 中的类之前使用。

有没有办法在 Ivy 中做到这一点?

我能想到的唯一方法是在我的ivy.xml 中创建两个单独的配置:

<dependency org="com.vegibank" name="a.jar"
    rev="1.0" conf="foo->default"/>

<dependency org="com.vegibank" name="b.jar"
    rev="1.0" conf="compile->default"/>

然后创建两个单独的路径类引用:

<ivy:cachepath pathid="compile.foo.classpath"
    conf="foo"/>
<ivy:cachepath pathid="compile.normal.classpath"
    conf="compile"/>

然后在&lt;javac/&gt;,我可以指定路径:

<javac ...>
    <classpath refid="compile.foo.classpath"/>
    <classpath refid="compile.normal.classpath"/>
</javac>

但是,我认为必须有一种方法来保证当 Ivy 进行解析时 jar 被加载到类路径中的方式。

有没有办法做到这一点?

【问题讨论】:

  • 您的解决方案看起来不错。老实说,我从来没有遇到过这个问题(在类路径上混合相同的类)。我假设这是某种奇怪的第 3 方包装问题?
  • @MarkO'Connor - 我最终按照上面提到的方式执行此操作:创建一个新配置,因此我可以强制该 jar 成为第一个。开发人员最终解决了这个问题。过时的 jar 类将该方法视为返回一个枚举器,而新 jar 的类将该方法视为返回一个迭代器。它需要对两三个源文件进行一些小的更改来修复它。当然,开发人员修复了该问题,但从未编译以确保其正常工作。它无法编译,因为正在使用过时的 jar 类。我必须解决我的问题。

标签: ant classpath ivy


【解决方案1】:

每个 Ivy Ant 任务甚至 IvyDE 都遵守 ivy.xml 文件中依赖项声明的顺序。因此,如果在您的 ivy.xml 中,您在 b.jar 之前声明了对 a.jar 的依赖,则生成的类路径将首先有 a.jar,然后有 b.jar。

【讨论】:

  • 感谢您的信息。我不确定这是否一定是真的。我在任何地方的文档中都找不到此信息。幸运的是,开发人员通过将类型声明为 iterator 而不是枚举器来解决此问题,从而消除了对过时 jar 的依赖。
猜你喜欢
  • 2020-09-04
  • 2011-09-19
  • 2015-08-31
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多