【问题标题】:Is there a way to call the ant 'ant' target with '-lib' option有没有办法用'-lib'选项调用蚂蚁'ant'目标
【发布时间】:2010-11-24 13:52:49
【问题描述】:

我正在开发一个 ant 脚本,它使用 <ant> 任务调用另一个 ant 脚本。此 ant 脚本是 Java 产品的安装程序,供我们的客户使用,他们将单独安装 ant。

被调用的脚本使用 antlr 任务<antlr:ant-antlr3>。为此,我必须将 ant-antlr3.jar 文件放在 ant lib 目录中,并将 antlr-3.2.jar 添加到类路径中。

但我不想在客户端自己安装的 ant 版本中拥有 ant-antl3.jar 文件的这种依赖关系。

有没有一种方法可以提供与 ant 的命令行“-lib”选项等效的方法,以使用 <ant> 任务本身为要添加到 antlib 的 jar 指定其他路径?

我查看了在线文档,似乎没有办法。

谢谢

【问题讨论】:

    标签: ant antlr


    【解决方案1】:

    我相信公认的方法是在构建文件中手动设置您的类路径,而不是通过全局 ant lib 目录隐式包含它。即

    <path id="master-classpath">
        <fileset dir="${lib}" />
        <fileset file="${findbugs-base}/lib/annotations.jar" />
        <pathelement location="${build-classes}" />
    </path>
    

    然后,您可以在任何可以接受类路径参数的任务中使用此路径元素,例如javac

    <javac
            destdir="${out}"
            source="1.5"
            target="1.5"
            debug="true">
        <src path="${src}" />
        <classpath refid="master-classpath" />
    </javac>
    

    这样,全局 ant 设置不是依赖项,您可以根据需要指定任何构建可能需要的任何文件(具体到给定的调用或目标)。

    显然,这一切都将在您从客户端的构建文件中调用的构建文件中执行。这样,当您调用自己的路径时,类路径将完全按照您的意愿设置。

    另一种不那么惯用的可能性是用Exec Task 直接掏空并以这种方式调用ant。显然,由于提供了 Ant 任务,ant 的开发人员不建议您这样做。不过,这是一种选择。

    【讨论】:

    • &lt;classpath&gt; 元素由 &lt;ant&gt; 元素支持。我尝试使用 refid 传递类路径,也就是说,我在构建文件中设置了路径,并将其作为 refid 传递给另一个构建文件。但这并没有被 antlr 任务 def 拾取,我认为因为用于 taskdef 的 jar 必须包含在 ant lib 中。
    【解决方案2】:

    Tim 的回答提供了大部分内容,但为了运行 Ant 并设置 JVM 选项,您需要通过 java 任务调用它。

    Ant 文档中有一个running this way 的示例,这里稍作修改以包含-lib

    <java
            classname="org.apache.tools.ant.launch.Launcher"
            fork="true"
            failonerror="true"
            dir="${sub.builddir}"
            timeout="4000000"
            taskname="startAnt"
    >
        <classpath>
            <pathelement location="${ant.home}/lib/ant-launcher.jar"/>
        </classpath>
        <arg value="-lib"/>
        <arg value="${path.to.your.antlr.jar}"/>
        <arg value="-buildfile"/>
        <arg file="${sub.buildfile}"/>
        <arg value="${sub.target}"/>
    </java>
    

    【讨论】:

    • 获得了上述工作方式,即以这种方式将自定义库传递给 ANT,但有更多的类路径错误。决定最简单的方法是向客户端提供带有自定义库等的 ANT 版本,并由安装程序运行,而不是自己运行。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2016-01-18
    • 2010-09-08
    相关资源
    最近更新 更多