2011-09-26 64 views
4

我有这个虚拟的目标:如何将多个参数传递给Ant中的目标?

<mkdir dir="${project.stage}/release 
<war destfile="${project.stage}/release/sigma.war"> 
    ... 
    ... 
    </war> 

我想要做的是提供两个参数说“ABC” &“XYZ”将取代分别释放与ABC和XYZ参数值的字。

对于第一个参数说ABC =“测试”,上面的代码将创建一个测试目录,并把战争中it.Similarly为XYZ =“生产”它会创建一个文件夹生产,并把战争文件里面。

我通过其中取决于上面提供的伪目标靶使用

<antcall target="create.war"> 
    <param name="test" value="${test.param.name}"/> 
    <param name="production" value="${prod.param.name}"/> 
</antcall> 

尝试这样做。 这是做这件事的正确方法。我想必须有一些方法来传递多个参数,然后循环遍历参数。

+0

为什么需要两个参数?是不是可以定义一个单独的参数“env”并将其设置为“测试”或“生产”? –

+0

那么两个参数是不必要的,我需要达到上述指定的目标。如果您可以提供更好的解决方案,欢迎您:) – EMM

回答

5

不幸的是,ant不支持像for或foreach循环这样的迭代,除非你引用文件。然而,蚂蚁贡献任务可以解决大部分(如果不是所有的)迭代问题。

你将不得不按照这里的说明先安装的.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 

我希望它能帮助:)

不使用蚂蚁的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

我承认我不明白这个问题的细节。是${project.stage}是否与xyzabc参数相同?为什么有两个参数xyzabc提到,当只有单词“发布”应该被替换?

知道什么是,macrodef(docu)是一件很灵活,它可能是很好地利用这里的:

<project name="Foo" default="create.wars"> 

    <macrodef name="createwar"> 
     <attribute name="stage" /> 
     <sequential> 
      <echo message="mkdir [email protected]{stage}/release " /> 
      <echo message="war [email protected]{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 

或许我们可以从这里开始并根据需要调整此示例。

+0

我想我已经在下面写了这个。 – FailedDev

+1

是,否 - 是:我承认,我没有注意到您的答案的更新。无部分:没有涉及“antcall”。我不能说这是提问者想要或不想要的。我们会看到。如果不是,我会删除我的答案。 –

+0

我不能责怪你。这个问题相当模糊。你不必删除任何东西。我们都在努力提供帮助。 – FailedDev

相关问题