【问题标题】:ANT passing all command line properties to <java>ANT 将所有命令行属性传递给 <java>
【发布时间】:2014-07-10 11:14:24
【问题描述】:

我有一个 ANT 构建系统,它使用以下宏调用不同项目的构建;

    <macrodef name="buildComponent">
    <attribute name="name"/>
    <attribute name="dir"/>
    <attribute name="antTarget"/>
    <attribute name="antCommonDistDir" />
    <sequential>
        <available property="build.xml.exists.@{dir}" file="@{dir}/build.xml" />
        <if>
            <equals arg1="${build.xml.exists.@{dir}}" arg2="true" />
            <then>
                <java   classname="org.apache.tools.ant.launch.Launcher"
                        fork="true"
                        failonerror="true"
                        dir="@{dir}"
                        timeout="4000000"
                        output="${common.build.dir}/log/@{name}.log"
                        taskname="startAnt"  >
                    <jvmarg value="-Dant.home=${ant.home}"/>
                    <classpath>
                        <pathelement location="${ant.home}/lib/ant-launcher.jar"/>
                    </classpath>
                    <arg value="-Dbasedir=@{dir}"/>
                    <arg value="@{antTarget}"/>
                    <arg value="-Dprop1=${prop1}" />

                    <syspropertyset refid="project.common.properties" />
                    <sysproperty key="common.dist.dir.os" value="@{antCommonDistDir}" />
                </java>
            </then>
        </if>
    </sequential>
</macrodef>

我想从命令行覆盖属性,但问题是这些属性没有被 任务传递,我的后续构建使用默认值。例如,我正在执行构建如下;

ant dist -Dprop1=override.prop1 -Dprop2=override.prop2 -Dprop3=override.prop3

如您所见,目前我从命令行为 prop2prop3 传递这些覆盖值的唯一选择是在每个任务的 &lt;java /&gt; 下添加 &lt;arg /&gt;像我为“prop1”所做的那样传递的属性有效但不可取。无论如何我可以访问传递给 ANT 的所有属性并简单地将它们传递给&lt;java /&gt; 任务吗?

【问题讨论】:

    标签: ant properties overriding


    【解决方案1】:

    您可以使用echoproperties 任务将所有当前Ant 属性保存到一个文件中,然后将该文件传递给java 任务以供子项目加载。

    <echoproperties destfile="my.properties"/>
    

    话虽如此,一个更好的解决方案不是执行java 命令来调用另一个Ant 构建,您可以简单地调用ant 任务,它将构建您的子项目并自动继承所有属性来自父项目:

    <available property="build.xml.exists.@{dir}" file="@{dir}/build.xml" />
    <if>
        <equals arg1="${build.xml.exists.@{dir}}" arg2="true" />
        <then>
            <ant antfile="@{dir}/build.xml" target="@{antTarget}"/>
        </then>
    </if>
    

    【讨论】:

      【解决方案2】:

      我找不到任何可以直接做到这一点的东西。所以我最终编写了一个 javascript 并填充了一个 ant 属性来解析存储在 env 变量中的命令行选项,并将其作为&lt;arg line="${command.line.properties}" /&gt; 传递给&lt;java /&gt; 任务。请记住使用&lt;arg line="" />,因为它会在调用任务之前删除所有多余的空格等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        • 2012-01-29
        • 2011-02-27
        • 1970-01-01
        • 2012-12-23
        相关资源
        最近更新 更多