apache ant 可变文件类型 属性
apache ant mutable file type property
我正在寻找一种在 ant 脚本中从文件加载属性的方法。具体来说,我想遍历属性文件列表,并在每个循环中从当前文件加载属性并对其进行处理。像这样:
<for param="file">
<path>
<fileset containing my properties files.../>
</path>
<sequential>
<property file="@{file}" prefix="fromFile"/>
<echo message="current file: @{file}"/>
<echo message="property1 from file: ${fromFile.property1}"/>
</sequential>
</for>
上面的代码导致只读取第一个属性文件,即使每个循环确实遍历每个属性文件名。我知道 属性 是不可变的,我可以通过使用来自 ant-contrib 的本地任务或变量任务来绕过它。但是,我不知道如何在这里应用它们,或者它们是否有助于解决这种情况。
这里我使用了 Antcontrib 和两个 属性 文件在与 build.xml
.
相同的目录中
p1.properties:
property1=from p1
p2.properties:
property1=from p2
诀窍是在 for 循环中使用 antcall
来调用另一个目标。在被调用目标中设置的属性不会传播回调用者。
build.xml:
<project name="test" default="read.property.files">
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="ant-contrib/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
<target name="read.property.files">
<for param="file">
<path>
<fileset dir="." includes="*.properties"/>
</path>
<sequential>
<antcall target="read.one.property.file">
<param name="propfile" value="@{file}"/>
</antcall>
</sequential>
</for>
</target>
<target name="read.one.property.file">
<property file="${propfile}" />
<echo message="current file: ${propfile}" />
<echo message="property1 from file: ${property1}"/>
</target>
</project>
输出为:
Buildfile: /home/vanje/anttest/build.xml
read.property.files:
read.one.property.file:
[echo] current file: /home/vanje/anttest/p1.properties
[echo] property1 from file: from p1
read.one.property.file:
[echo] current file: /home/vanje/anttest/p2.properties
[echo] property1 from file: from p2
BUILD SUCCESSFUL
Total time: 0 seconds
在我最初的问题中,我无法从 for 循环(来自 ant-contrib)中加载整个属性文件。结果在 for 循环内部,ant-contrib 自己的 var 任务与来自纯 ant 的 属性 任务一样工作。我所要做的就是将 <property file="@{file}" prefix="fromFile"/>
替换为 <var file="@{file}"/>
。加载的属性将被最新值覆盖,我什至不需要前缀属性来跟踪我当前所在的循环。
我正在寻找一种在 ant 脚本中从文件加载属性的方法。具体来说,我想遍历属性文件列表,并在每个循环中从当前文件加载属性并对其进行处理。像这样:
<for param="file">
<path>
<fileset containing my properties files.../>
</path>
<sequential>
<property file="@{file}" prefix="fromFile"/>
<echo message="current file: @{file}"/>
<echo message="property1 from file: ${fromFile.property1}"/>
</sequential>
</for>
上面的代码导致只读取第一个属性文件,即使每个循环确实遍历每个属性文件名。我知道 属性 是不可变的,我可以通过使用来自 ant-contrib 的本地任务或变量任务来绕过它。但是,我不知道如何在这里应用它们,或者它们是否有助于解决这种情况。
这里我使用了 Antcontrib 和两个 属性 文件在与 build.xml
.
p1.properties:
property1=from p1
p2.properties:
property1=from p2
诀窍是在 for 循环中使用 antcall
来调用另一个目标。在被调用目标中设置的属性不会传播回调用者。
build.xml:
<project name="test" default="read.property.files">
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="ant-contrib/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
<target name="read.property.files">
<for param="file">
<path>
<fileset dir="." includes="*.properties"/>
</path>
<sequential>
<antcall target="read.one.property.file">
<param name="propfile" value="@{file}"/>
</antcall>
</sequential>
</for>
</target>
<target name="read.one.property.file">
<property file="${propfile}" />
<echo message="current file: ${propfile}" />
<echo message="property1 from file: ${property1}"/>
</target>
</project>
输出为:
Buildfile: /home/vanje/anttest/build.xml
read.property.files:
read.one.property.file:
[echo] current file: /home/vanje/anttest/p1.properties
[echo] property1 from file: from p1
read.one.property.file:
[echo] current file: /home/vanje/anttest/p2.properties
[echo] property1 from file: from p2
BUILD SUCCESSFUL
Total time: 0 seconds
在我最初的问题中,我无法从 for 循环(来自 ant-contrib)中加载整个属性文件。结果在 for 循环内部,ant-contrib 自己的 var 任务与来自纯 ant 的 属性 任务一样工作。我所要做的就是将 <property file="@{file}" prefix="fromFile"/>
替换为 <var file="@{file}"/>
。加载的属性将被最新值覆盖,我什至不需要前缀属性来跟踪我当前所在的循环。