0

我正在尝试设置我的 ant 构建,以便运行 Ivy 函数的目标与持续构建和大多数开发人员运行的目标完全分离。我想要一个目标下载更新的依赖项,我将签入。其他目标将通过包含相关目录中的 *.jar 来设置它们的类路径。

我有两种配置:

<configurations>
    <conf name="compile" />
    <conf name="test" />
</configurations>

我有一些依赖:

<dependency
    org="my.org"
    name="some-lib"
    rev="latest.release"
    conf="compile->default" />
<dependency
    org="my.org"
    name="some-test-lib"
    rev="latest.release"
    conf="test->default" />

我使用 ivy:retrieve 下载这些依赖项及其传递依赖项:

<ivy:retrieve
    pattern="lib/[conf]/[type]/[artifact]-[revision].[ext]"
    sync="true"
    file="ivy.xml" />

问题是我在 compile 和 test 目录之间看到了一些重复的 jar,它们来自传递依赖项。由于我想检查所有这些 jar 并将它们用于创建类路径,我想避免重复。这可能吗?

lib/compile/jar/some-lib-1.0.jar
lib/compile/jar/ slf4j-api-1.5.11.jar
lib/test/jar/some-test-lib-1.0.jar
lib/test/jar/junit -4.7.jar
lib/test/jar/ slf4j-api-1.5.11.jar

4

3 回答 3

3

这不是重复,每个配置都是一组单独的 jar,而 ivy retrieve任务是忠实地创建每组....

也许直接创建类路径而不是填充本地lib目录更有意义。

这是我的 ANT 构建文件的片段:

<target name="get-dependencies">
    <ivy:resolve/>

    <ivy:cachepath pathid="compile.path" conf="compile" />
    <ivy:cachepath pathid="test.path" conf="test" />
</target>

<target name="compile" depends="get-dependencies">
    <javac srcdir="src" destdir="build/classes" classpathref="compile.path"/>
</target>

我通常只在需要创建一组 jar 的本地副本时才使用 ivy检索任务,例如组装 Web 应用程序的目录:

<ivy:retrieve pattern="build/WEB_INF/lib/[artifact].[ext]" conf="runtime"/>

更新

另一种选择是指示ivy在下载瞬态依赖时排除slf4j模块,如下:

<dependency org="my.org" name="some-lib" rev="latest.release" conf="compile->default">
    <exclude module="slf4j-api"/> 
</dependency>

<dependency org="my.org" name="some-test-lib" rev="latest.release" conf="test->default">
    <exclude module="slf4j-api"/> 
</dependency>
于 2010-06-22T19:31:02.197 回答
0

如果我可以直接通过 Ivy 做到这一点,那将是最好的。现在我已经通过使用 ant 删除重复项解决了这个问题。

于 2010-06-23T19:06:03.653 回答
0

试试下面的。您的测试应该扩展编译

<dependency
org="my.org"
name="some-test-lib"
rev="latest.release"
conf="**test->compile**" />

如果我是对的,IVY 应该会发现测试扩展编译并且只会下载 slf4j 一次。

于 2010-06-24T02:04:25.983 回答