如何允许Ant属性文件覆盖另一个的属性值?

Chr*_*s R 31 ant

我有一个ant文件,它执行以下操作:

<property file="project.properties" description="Project configuration properties"/>
<property file="build-defaults.properties" description="default build configuration."/>
<property file="build.properties" description="local build configuration overrides"/>
Run Code Online (Sandbox Code Playgroud)

我希望在build-defaults.properties(已签入SCM)中设置默认值,但允许开发人员覆盖本地build.properties中的值,以便它们可以使用本地路径.

问题是,它似乎没有起作用; 我已经设置了它,在build.properties中创建了一个覆盖,但是我的路径的值仍然是build-defaults.properties中设置的值.我该如何做到这一点?

Tim*_*her 49

你的设置的最初问题是你得到build.propertiesbuild-defaults.properties扭转了.

Ant属性设置一次,然后永远不能被覆盖.这就是为什么通过a在命令行上设置任何属性-Dproperty=value将始终覆盖您在文件中设置的任何内容; 该属性已设置,然后没有任何东西可以覆盖它.

所以你想要这个设置的方式是:

<property file="build.properties" description="local build configuration overrides"/>
<property file="project.properties" description="Project configuration properties"/>
<property file="build-defaults.properties" description="default build configuration."/>
Run Code Online (Sandbox Code Playgroud)

这条路:

  1. 在命令行中设置的任何内容都优先于build.properties
  2. build.properties中设置的任何内容都会覆盖其他值
  3. 下线.


Jar*_*zek 17

实际上,可以覆盖蚂蚁属性.请参阅属性任务的文档:

通常,属性值无法更改,一旦设置了属性,大多数任务都不允许修改其值.

能够覆盖属性值的任务之一是script.任何自定义任务也可以使用此后门.其他提议有问题Ant loadfile覆盖属性.这违背了蚂蚁的精神,通常是不必要的.但是知道这一点很好,因为我只是遇到了一个相反的问题:为什么属性值会发生变化,尽管它是不可变的.

以下是使用脚本任务更改属性值的示例目标.它显示了使用属性的基本方法.Ant Api中描述了所有方法,这些方法无法在线获取.您需要下载Ant手册.在其api目录中有api文档.

  <target name="t1">
    <property name="a" value="one" />
    <script language="javascript">
      sProp = project.getProperty("a");
      sProp = sProp.replace("e", "ly");
      project.setProperty("a", sProp);
      project.setNewProperty("a", "new value");
    </script>
    <property name="a" value="two" />
    <echo>a=${a}</echo>
  </target>
Run Code Online (Sandbox Code Playgroud)

如何轻松设置script任务?使用beanshell语言运行脚本任务有点棘手且不重要,但在此答案对此进行了解释.然而正如Rebse指出的那样,javascript在jdk 6中开箱即用支持语言.

  • 使用jdk> = 1.6时设置脚本任务并不棘手,因为jdk已经附带了javascript引擎(基于R​​hino 1.6R2),因此不再需要额外的jar(Bean Scripting Framework和东西..).只需使用javascript脚本任务.或者使用只需要一个jar的Groovy (2认同)

HMK*_*HMK 6

Ant 属性不能被覆盖,除非使用宏和 javascript 插件来做:

第一步:定义一个宏函数来覆盖属性

 <!--overwrite property's value-->
    <macrodef name="set" >
        <attribute name="name"/>
        <attribute name="value"/>
        <sequential>
            <script language="javascript">
                <![CDATA[
                project.setProperty("@{name}", "@{value}");
                ]]>
            </script>
        </sequential>
    </macrodef>
Run Code Online (Sandbox Code Playgroud)

第二步:使用ant xml中的宏

<set
    name="your_target_property"
    value="your_value" or "${another_property}"     
</set>
Run Code Online (Sandbox Code Playgroud)