ANT将所有命令行属性传递给<java> </java>

时间:2014-07-10 11:14:25

标签: ant properties override

我有一个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

正如您所看到的那样,我唯一可以从命令行为 prop2 prop3 传递这些重写值,只需在{{1}下添加<arg />每个属性传递的任务就像我为'prop1'所做的那样有效但不可取。无论如何,我可以访问传递给ANT的所有属性,只是按原样传递给<java />任务吗?

2 个答案:

答案 0 :(得分:3)

您可以使用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>

答案 1 :(得分:0)

我找不到任何可以直接做到这一点的事情。所以我最终编写了一个javascript并填充了一个ant属性来解析命令行选项,该选项存储在env变量中并作为<java />传递给<arg line="${command.line.properties}" />任务。请务必使用<arg line="" /&gt;因为它在调用任务之前修剪了所有额外的空格等。