【问题标题】:Get ivy:retrieve to not copy a jar into two configurations?获取 ivy:retrieve 以不将 jar 复制到两个配置中?
【发布时间】:2010-06-21 19:11:35
【问题描述】:

我正在尝试设置我的 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

【问题讨论】:

    标签: java ant ivy dependency-management


    【解决方案1】:

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

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

    这是我的 ANT 构建文件的 sn-p:

    <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 retrieve 任务,例如组装网络应用的目录:

    <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>
    

    【讨论】:

    • 我想检查 lib 目录,以便可以在某些目录中从 *.jar 创建类路径。这样构建完全不依赖于网络。
    • cachepath 任务基于位于本地 ivy 缓存中的 jars 创建一个类路径,因此不涉及网络。 retrieve 任务的工作方式与将文件从缓存复制到指定目录中的方式相同
    • 如果您使用目录来创建类路径,为什么要删除 jar?如果 jar 不应该在类路径中,它可以在依赖声明中排除。见ant.apache.org/ivy/history/latest-milestone/ivyfile/…
    • 项目中没有其他人会使用 Ivy,因此他们不会有 Ivy 缓存。他们的类路径将通过在 Ivy 创建的目录中包含我将签入的所有 jar 包来创建。我可以签入重复项,但在 VCS 中拥有所有这些是浪费的。
    【解决方案2】:

    如果我可以直接通过 Ivy 做到这一点,那将是最好的。现在我已经通过deleting duplicates using ant.解决了这个问题

    【讨论】:

      【解决方案3】:

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

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

      如果我是对的,IVY 应该会发现 test extends compile 并且只会下载 slf4j 一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-12
        • 2015-09-16
        • 2020-03-31
        • 1970-01-01
        • 2013-08-19
        • 2012-03-12
        相关资源
        最近更新 更多