导入的Ant文件的“覆盖”属性

时间:2015-03-26 13:08:09

标签: java ant properties

我想覆盖导入的Ant-File的一些属性,这些属性处理部署应用程序的大部分基本内容。首先,我知道Ant中的属性是不可变的。但我可以想到两种方法来“覆盖”我的需求属性,我想知道,哪一个应该是首选方法,和/或是否有任何事情要考虑通过这样或那样做。

想象一下,我们有以下 master-build-script ,我想在我的构建脚本中导入:

<project name="Application" default="build" basedir=".">

    <property name="overridden" value="false" />

    <target name="build">
        <echo message="Value of overridden is ${overridden}" /> 
    </target>
</project>

现在我要覆盖重写的属性。在这两种情况下,我都会导入 master-build-file 。我使用import over include,因为我也想覆盖一些目标。我知道有两种可能的解决方案来覆盖它们:

1)由于属性是不可变的,我可以通过在实际导入主文件之前定义它们来定义属性我想“覆盖”:

<project name="MyApplication" default="buildApplication" basedir=".">

    <property name="overridden" value="true" />

    <import file="master-build.xml" />

    <target name="buildApplication">
        <antcall target="build" />
    </target>
</project>

2)我在Ant调用中定义了Params,它似乎也重新定义了一个属性值:

<project name="MyApplication" default="buildApplication" basedir=".">

    <import file="master-build.xml" />

    <target name="buildApplication">
        <antcall target="build" >
            <param name="overridden" value="true"/>
        </antcall>
    </target>
</project>

在这两种情况下,结果都是:

build:
     [echo] Value of overridden is true
BUILD SUCCESSFUL

有人会这么善良,可以解释我的差异,也可以解释为什么我应该使用一种方式而不是另一种方式,或者甚至应该使用不同的方法来获得相同的结果?

2 个答案:

答案 0 :(得分:1)

第一个和第二个示例之间的主要区别在于,在第二种情况下,属性仅为子构建定义,有时可能是您想要的,而不是全局构建。

您可以在全球范围内预先定义属性的其他方式...

执行ant时,

传递为JVM args ,例如

ant -Doverridden=true

定义文件中的属性并在构建开始时加载,例如

build.properties:

overridden=true

的build.xml:

<project name="MyApplication" default="buildApplication" basedir=".">

<property file="build.properties/>

一个有用的变体是从用户主目录加载用户可定义的属性,例如类似的东西:

<property file="${user.home}/MyApplication/build.properties/>

与您提供的示例相比,这两种方法的优点是可以在不更改构建文件的情况下覆盖属性。

答案 1 :(得分:1)

Ant版本1.8及更高版本附带<local/>任务,允许您将属性声明为本地属性。这可能就是你所需要的。

另一种选择是使用<macrodef>,它允许您定义自己的宏(这比使用<antcall>更好,因为<antcall>可以破坏Ant创建执行的能力矩阵)。