我有一个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传递这些覆盖的值是在<java />
任务下添加<arg />
,就像我为'prop1'所做的那样,它有效但不可取。无论如何,我可以访问传递给ANT的所有属性,并简单地将它们传递给<java />
任务?
您可以使用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>
我找不到任何可以直接做到这一点的东西。因此,我最终编写了一个javascript,并填充了一个ant属性来解析存储在env变量中的命令行选项,并将其作为<arg line="${command.line.properties}" />
传递给<java />
任务。请记住在调用任务之前使用<arg line=""
/>,因为它会删除所有额外的空格等。