【问题标题】:"Override" properties of an imported Ant file导入的 Ant 文件的“覆盖”属性
【发布时间】:2015-03-26 13:08:09
【问题描述】:

我想覆盖导入的 Ant 文件的一些属性,该文件处理部署应用程序的大部分基本内容。首先我知道 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>

现在我想覆盖 overridden 属性。在这两种情况下,我都会导入 master-build-file。我使用导入而不是包含,因为我还想覆盖一些目标。我知道有两种可能的解决方案来覆盖它们:

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

谁能这么好心,可以解释我的区别,也可以解释为什么我应该使用一种方法而不是另一种方法,甚至应该使用不同的方法来获得相同的结果?

【问题讨论】:

    标签: java ant properties


    【解决方案1】:

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

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

    在执行 ant 时作为 JVM 参数传递,例如

    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/>
    

    与您提供的示例相比,这两种方法的优势在于无需更改构建文件即可覆盖属性。

    【讨论】:

      【解决方案2】:

      Ant 1.8 及更高版本带有&lt;local/&gt; 任务,允许您将属性声明为本地属性。这可能是您需要的。

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

      【讨论】:

      • 老实说,我不知道 macrodef beeing 比 antcall 更受欢迎。这真的很有趣,我已经找到了一些关于 macrodef 优于 antcall 的文章。感谢分享!
      猜你喜欢
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多