如何允许Ant属性文件覆盖另一个属性文件中的值集?
我有一个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
<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."/>
这样:
实际上,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脚本编写。这不完全是你的问题,而且符合答案:下面是如何