使用Ivy在Ant构建中设置路径的最小配置吗?

时间:2017-02-17 15:57:44

标签: ant ivy

我想使用工件中定义的Ant任务。工件存在于主Maven存储库中,并且具有一些依赖性。

我想使用Ivy和Ant来:

  1. 声明对该工件及其传递依赖项的依赖关系,以便在运行脚本时解析它们。
  2. 将所有jar文件作为Ant路径检索,我可以将其提供给Ant的taskdef。
  3. 请参阅构建脚本的其他部分中已解析的jar文件集。
  4. 到目前为止,我发现的文档并未针对此用例进行优化。相反,它建议写文件ivy.xml,ivysettings.xml;我不喜欢这样,依赖关系足够小,我想在一个构建脚本中适应所有内容。

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

常春藤cachepath task是一个可用于创建ANT路径的解析任务。可能不为人所熟知的是,此解析任务也可以内联使用,换句话说,您可以直接指定依赖项而无需常春藤文件。

<ivy:cachepath pathid="tasks.path">
    <dependency org="org.codehaus.groovy" name="groovy-all" rev="2.4.7" conf="default"/>
</ivy:cachepath>

对于使用常春藤文件管理多个类路径的相关答案:

实施例

以下示例是通过演示常春藤下载与groovy任务相关联的jar来实现的。我还包括了一个用于安装常春藤罐的实用程序目标。

的build.xml

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

    <available classname="org.apache.ivy.Main" property="ivy.installed"/> 

    <!--
    ============
    Main targets 
    ============
    -->
    <target name="resolve" depends="install-ivy">
        <ivy:cachepath pathid="tasks.path">
            <dependency org="org.codehaus.groovy" name="groovy-all" rev="2.4.7" conf="default"/>
        </ivy:cachepath>
    </target>

    <target name="build" depends="resolve">
        <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="tasks.path"/>

        <groovy>
          ant.echo "Hello world"
        </groovy>
    </target>

    <!--
    ==================
    Supporting targets
    ==================
    -->
    <target name="install-ivy" description="Install ivy" unless="ivy.installed">
        <mkdir dir="${user.home}/.ant/lib"/>
        <get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.4.0/ivy-2.4.0.jar"/>
        <fail message="Ivy has been installed. Run the build again"/>
    </target>

    <target name="clean" description="Cleanup build files">
        <delete dir="${build.dir}"/>
    </target>

    <target name="clean-all" depends="clean" description="Additionally purge ivy cache">
        <ivy:cleancache/>
    </target>

</project>