9

我正在研究使用 Ivy 来管理依赖项,但是哇——那东西真的很喜欢制作 jar 的多个副本!它像我后院的常春藤一样蔓延,同样不受欢迎!

是否可以让 Ivy 简单地定义一个引用已解析依赖项的类路径(对于指定的配置文件),以便我的 javac 可以直接在 ivy 存储库(或缓存?)中引用它们。

我已经阅读了参考文档购买只看到设置符号链接到存储库缓存的选项。我想这已经足够了,但这似乎是一种浪费。另外,我不确定“战争”任务是否可以从符号链接构建战争......但我想我会在尝试时发现。

有更好的建议吗?

4

3 回答 3

15

这是我创建可执行文件的标准 Java 构建文件jar

目标是通过组合 ANT 属性和ivy.xml第 3 方依赖项的文件来管理项目特定的东西。

<project xmlns:ivy="antlib:org.apache.ivy.ant" name="demo" default="build">

  <property name="src.dir" location="src"/>
  <property name="build.dir" location="build"/>
  <property name="dist.dir" location="dist"/>
  <property name="dist.jar" location="${dist.dir}/${ant.project.name}.jar"/>
  <property name="dist.main.class" value="HelloWorld"/>

  <target name="retrieve">
    <ivy:resolve/>
    <ivy:cachepath pathid="build.path" conf="build"/>
    <ivy:cachepath pathid="runtime.path" conf="runtime"/>
  </target>

  <target name="compile" depends="retrieve">
    <mkdir dir="${build.dir}/classes"/>
    <javac srcdir="${src.dir}" destdir="${build.dir}/classes" classpathref="build.path"/>
  </target>

  <target name="build" depends="compile">
    <ivy:retrieve pattern="${dist.dir}/lib/[artifact].[ext]"/>

    <manifestclasspath property="jar.classpath" jarfile="${dist.jar}">
      <classpath>
        <fileset dir="${dist.dir}/lib" includes="*.jar"/>
      </classpath>
    </manifestclasspath>

    <jar destfile="${dist.jar}" basedir="${build.dir}/classes">
      <manifest>
        <attribute name="Main-Class" value="${dist.main.class}"/>
        <attribute name="Class-Path" value="${jar.classpath}"/>
      </manifest>
    </jar>
  </target>

  <target name="clean">
    <delete dir="${build.dir}"/>
    <delete dir="${dist.dir}"/>
  </target>

</project>

正如您在 Ivy 文档中发现的那样,cachepathIvy 任务用于管理两个 ANT 路径。一个用于构建依赖项,另一个用于可执行文件的运行时依赖项jar

常春藤的真正力量在于一种叫做configurations. 我发现最初很难掌握,直到我意识到这是一个简单的逻辑分组jar,我可以为我的项目定义。这个例子有两个configurations

  • build
  • runtime

这是 ivy 文件,展示了如何关联依赖项configurations

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>
    <configurations>
        <conf name="build" description="Libraries needed to for compilation"/>
        <conf name="runtime" extends="build" description="Libraries that need to be included with project jar" />
    </configurations>
    <dependencies>
        <dependency org="commons-lang" name="commons-lang" rev="2.0" conf="build->default"/>
        <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="runtime->default"/>
    </dependencies>
</ivy-module>

总之,我希望这个例子有助于理解 Ivy。我喜欢它只专注于一件事的方式,即管理第 3 方依赖项。

于 2010-04-09T22:25:21.383 回答
3

在与写得很糟糕的 Ivy 文档作斗争之后(叹息 - 这些人有什么问题? - 他们没有参加任何语言的高中识字课程吗?),我看到有一个名为cachepath的解决后任务将构建一个蚂蚁已解析的依赖项工件的路径,而不是将文件复制到 lib 目录。这可能正是我正在寻找的!

于 2010-04-09T19:06:45.053 回答
3

只是为了增加@Mark的答案。

请注意,cachepath结果也可以直接在构建中使用,而无需使用以下命令复制 jar retrieve

<target name="build" depends="compile">
    <jar destfile="${dist.ear}">
        <mappedresources>
            <resources refid="runtime.path"/>
            <chainedmapper>
                <flattenmapper/>
                <globmapper from="*" to="lib/*"/>
            </chainedmapper>
        </mappedresources>
    </jar>
</target>
于 2013-10-07T09:09:07.067 回答