我有这个虚拟目标:
<mkdir dir="${project.stage}/release
<war destfile="${project.stage}/release/sigma.war">
...
...
</war>
我想要做的是提供两个参数说“abc”&amp; “xyz”将分别用abc和xyz参数的值替换 release 这个词。
对于第一个参数说abc =“test”,上面的代码将创建一个 test 目录并将war放入其中。类似于xyz =“production”它将创建一个文件夹生产并将war文件放入其中。
我尝试使用
<antcall target="create.war">
<param name="test" value="${test.param.name}"/>
<param name="production" value="${prod.param.name}"/>
</antcall>
在依赖于上面提供的虚拟目标的目标中。 这是正确的方法吗。我想必须有一些方法来传递多个参数,然后一次循环一个参数。
答案 0 :(得分:5)
不幸的是,除非你引用文件,否则ant不支持像for或foreach循环这样的迭代。然而,ant contrib任务可以解决大多数(如果不是全部)迭代问题。
您必须先按照此处的说明安装.jar:http://ant-contrib.sourceforge.net/#install
这应该需要大约10秒钟。在您可以简单地使用foreach任务迭代自定义列表之后。作为示例,您可以按照以下build.xml文件:
<project name="test" default="build">
<!--Needed for antcontrib-->
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
<target name="build">
<property name="test" value="value_1"/>
<property name="production" value="value_2"/>
<!--Iterate through every token and call target with parameter dir-->
<foreach list="${test},${production}" param="dir" target="create.war"/>
</target>
<target name="create.war">
<echo message="My path is : ${dir}"/>
</target>
</project>
输出:
build:
create.war:
[echo] My path is : value_1
create.war:
[echo] My path is : value_2
BUILD SUCCESSFUL
Total time: 0 seconds
我希望它有所帮助:)
不使用ant contrib的第二种解决方案。您可以将所有逻辑封装到macrodef中,然后只需调用它两次。在任何情况下,您都需要在构建文件中的某个位置编写这两个参数。我认为没有任何方法可以在不使用外部.jars或BSF语言的情况下迭代属性。
<project name="test" default="build">
<!--Needed for antcontrib-->
<macrodef name="build.war">
<attribute name="dir"/>
<attribute name="target"/>
<sequential>
<antcall target="@{target}">
<param name="path" value="@{dir}"/>
</antcall>
</sequential>
</macrodef>
<target name="build">
<property name="test" value="value_1"/>
<property name="production" value="value_2"/>
<build.war dir="${test}" target="create.war"/>
<build.war dir="${production}" target="create.war"/>
</target>
<target name="create.war">
<echo message="My path is : ${path}"/>
</target>
</project>
答案 1 :(得分:1)
我承认我不明白这个问题。 ${project.stage}
与xyz
和abc
参数相同吗?为什么有两个参数 xyz
和abc
,只有“release”这个词应该被替换?
我知道的是,macrodef
(docu)是非常通用的东西,它可能在这里很有用:
<project name="Foo" default="create.wars">
<macrodef name="createwar">
<attribute name="stage" />
<sequential>
<echo message="mkdir dir=@{stage}/release " />
<echo message="war destfile=@{stage}/release/sigma.war" />
</sequential>
</macrodef>
<target name="create.wars">
<createwar stage="test" />
<createwar stage="production" />
</target>
</project>
输出将是:
create.wars:
[echo] mkdir dir=test/release
[echo] war destfile=test/release/sigma.war
[echo] mkdir dir=production/release
[echo] war destfile=production/release/sigma.war
也许我们可以从这里开始并根据需要调整这个例子。