ANT:将字符串拆分为多个参数

时间:2015-03-31 12:01:58

标签: java ant ant-contrib xmltask

我刚刚完成了一个ANT脚本(完美地完成了这项工作)。 但是有一个新的要求,脚本必须改变。 目标是使用名为deploy-all.txt的ANT部署文件。该文件看起来像

client1=name1=server1+server2=repositoryX
client2=name2=server1+server3=repositoryY
client3=name3=server2+server4=repositoryZ

只有一个客户端,只有一个名称,从1到几个服务器,只有一个存储库和一个类型。

目标是什么:对于每一行,我需要获取变量,以便我可以解析它们并执行任务。 输出应为

client=client1
name=name1
server=server1
server=server2 (could be more)
repository=repository1

必须为每一行解析这些参数。 我确实有一个名为GENERIC.WAR的通用APP - 这样做并且效果很好。现在应用程序需要单独的插件,需要构建/部署。

该脚本会做什么:

a) copy generic GENERIC.WAR file to server1 and server2 with name scecified as client1 (SCP using scp task)
b) get svn repository based on repositoryX (svn update ant task)
c) get name and loop through existing code (using xmltask from checked out repository) to find right code to compile and zip it (have done it already)

所以我可以执行所有任务但不能将每个元素解析为每行的单独参数。我尝试for listsequential但到目前为止没有成功。我可以将所有但仅作为一个参数分开。我无法将它作为多个参数来获取,我可以遍历每一行并解析其他任务。

因为它只是一个开始 - 我可以改变设计 - 例如使用XML而不是TXT。 它是可行的,如果是的话,请你帮我解释如何。

1 个答案:

答案 0 :(得分:4)

如果您首先在"命名空间"中定义属性键。时尚,我认为你会发现更容易实现你所需要的,例如。

client.list=client1,client2
client1.name=client1
client1.server.list=server1,server2
client1.repository=repositoryX
client2.name=name2
client2.server.list=server1,server3
client2.repository=repositoryY

现在您有一组具有唯一键的属性,您可以在循环和/或宏定义中交叉引用。

以下是您如何使用它的示例:

<property file="deploy-all.txt"/>

<target name="test">
    <for list="${client.list}" param="client">
        <sequential>
            <deploy client="@{client}"/>
        </sequential>
    </for>
</target>

<macrodef name="deploy">
    <attribute name="client"/>
    <sequential>
        <echo>client: @{client}</echo>
        <for list="${@{client}.server.list}" param="server">
            <sequential>
                <echo>server: @{server}</echo>
            </sequential>
        </for>
        <echo>repository: ${@{client}.repository}</echo>
    </sequential>
</macrodef>

输出:

test:
     [echo] client: client1
     [echo] server: server1
     [echo] server: server2
     [echo] repository: repositoryX
     [echo] client: client2
     [echo] server: server1
     [echo] server: server3
     [echo] repository: repositoryY