如何使用ant -D键传递的属性文件值覆盖?

时间:2012-08-16 13:42:42

标签: java ant

这是一个属性文件:

test.url=https:\\url:port
test.path=/home/folder
test.location=Location
test.version=1

以下蚂蚁任务:

                                             

我可以为任务的一次运行传递临时值:

ant -Dtest.path=new_path test_props

如何使用-D键传递test.path值?按顺序,在同一次启动之后,test.path的值会改变为我在上面传递的值吗?

以下变体不起作用:

<entry key="test.path" value="${test.path}"/>

<propertycopy name="test.path" from="${test_path}"/>

1 个答案:

答案 0 :(得分:1)

如果您想永久更改文件,可以使用 task

我会做以下事情:

创建一个示例属性文件,例如default.properties.sample。

创建一个接收给定-D属性的目标,然后,如果已通知,则对文件default.properties.sample进行替换,将其保存到default.properties文件中。 default.properties.sample将包含以下行:

test.url=https:\\url:port
test.path=@test_path@
test.location=Location
test.version=1

该操作将使用属性的实际值替换@ test_path @标记,如-D参数中所示,然后将生成的文件保存为default.properties。类似的东西:

<copy file="default.properties.sample" toFile="default.properties" />
<replace file="default.properties" token="@test_path@" value="${test.path}" />

需要进行一些调整,例如:如果通知了-D参数,则只替换属性,否则每次都会替换文件。

路径等也应根据您的需求进行调整。


我测试了以下场景,它对我有用:

我创建了两个文件:build.xml和default.properties.sample。他们的内容如下:

的build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="BuildTest" default="showProperties" basedir=".">
    <property file="default.properties"/>

    <target name="showProperties">
        <echo message="test.property=${test.property}"/>
    </target>

    <target name="replace">
        <fail unless="new.test.property" message="Property new.test.property should be informed via -D parameter"/>
        <copy file="default.properties.sample" toFile="default.properties"/>
        <replace file="default.properties" token="@test_property@" value="${new.test.property}"/>
    </target>
</project>

default.properties.sample:

test.property=@test_property@

他们会进行以下测试:

默认运行:

C:\Filipe\Projects\BuildTest>ant
Buildfile: C:\Filipe\Projects\BuildTest\build.xml

showProperties:
     [echo] test.property=${test.property}

BUILD SUCCESSFUL
Total time: 0 seconds

错误控制:

C:\Filipe\Projects\BuildTest>ant replace
Buildfile: C:\Filipe\Projects\BuildTest\build.xml

replace:

BUILD FAILED
C:\Filipe\Projects\BuildTest\build.xml:10: Property new.test.property should be      informed via -D parameter
Total time: 0 seconds

替换财产:

C:\Filipe\Projects\BuildTest>ant replace -Dnew.test.property="This is a New Value"
Buildfile: C:\Filipe\Projects\BuildTest\build.xml

replace:
     [copy] Copying 1 file to C:\Filipe\Projects\BuildTest

BUILD SUCCESSFUL
Total time: 0 seconds

替换后的属性文件:

C:\Filipe\Projects\BuildTest>type default.properties
test.property=This is a New Value

在随后的运行中,test.property的新值存在:

C:\Filipe\Projects\BuildTest>ant
Buildfile: C:\Filipe\Projects\BuildTest\build.xml

showProperties:
     [echo] test.property=This is a New Value

BUILD SUCCESSFUL
Total time: 0 seconds

我认为这就是你要找的东西。