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

如何允许Ant属性文件覆盖另一个属性文件中的值集?,ant,Ant,我有一个ant文件,它执行以下操作: <property file="project.properties" description="Project configuration properties"/> <property file="build-defaults.properties" description="default build configuration."/> <property file="build.properties" descripti

我有一个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"/>

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


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

设置的最初问题是,您的
build.properties
build defaults.properties
被颠倒了

设置一次,然后再也无法覆盖。这就是为什么通过
-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."/>

这样:

  • 命令行中设置的任何内容都优先于build.properties
  • build.properties中设置的任何内容都会覆盖其他值
  • 等等

  • 实际上,ant属性可能会被覆盖。请参阅以下文件:

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

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

    下面是一个使用脚本任务更改属性值的示例目标。它显示了处理属性的基本方法。所有方法都在Ant Api中描述,该Api在网上不可用。你需要下载。在其
    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>
    
    
    sProp=project.getProperty(“a”);
    sProp=sProp.替换(“e”,“ly”);
    项目。setProperty(“a”,sProp);
    项目。setNewProperty(“a”,“新价值”);
    a=${a}
    

    如何轻松设置
    脚本
    任务?
    使用
    beanshell
    语言运行脚本任务有点棘手,但在中进行了解释。但是,如前所述,jdk 6支持开箱即用的使用
    javascript
    语言。

    Ant属性不能被覆盖,除非使用宏和javascript插件执行以下操作:

    步骤1:定义宏函数以覆盖属性

     <!--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>
    
    
    
    步骤2:在ant xml中使用宏

    <set
        name="your_target_property"
        value="your_value" or "${another_property}"     
    </set>
    

    当使用jdk>=1.6时,设置脚本任务并不复杂,这意味着不再需要额外的JAR(Bean脚本框架和其他东西),因为jdk已经附带了javascript引擎(基于Rhino 1.6R2)。只需将脚本任务与javascript结合使用即可。。或者使用Groovy,它只需要一个jar@Rebse,你的
    javascript
    建议让我很开心。它就像一个符咒!我编辑了我的答案,将其包括在内。对于其他语言,即使它们只需要一个jar,该链接仍然很有用。无耻的促销警报;-)Ant插件Flaka()使许多脚本部分过时(属性覆盖、循环…),而且只需要一个jar。除了Flaka之外,我还经常使用Groovy——不仅用于ant脚本编写。这不完全是你的问题,而且符合答案:下面是如何