Apache Ant从模板和加载属性有条件地复制文件

时间:2014-04-03 00:09:55

标签: java svn ant

我有一个属性文件(x.props),其中包含Ant构建所需的属性:

x.props:

 prop1=something
 prop2=somethingElse

在build.xml中设置:

 <property file="x.props" />

然后,x.props中包含的属性将用于路径任务:

 <path id="project.class.path">
    <pathelement location="${prop1}/important.jar"/>
    <pathelement location="${prop2}/anotherImportant.jar"/>
 </path>

编译开始之前。我没有在build.xml

中显式创建这些属性

x.props文件对于每个本地用户可以是不同的,但对于服务器构建,它不会改变。

我创建了一个x.props.template文件来解决用户不小心检入或更新此文件的问题(但他们需要能够检查出来)。我希望能够从x.props.template创建一个x.props文件(我将x.props设置为svn:ignore)。

用户可以将模板文件保存为x.props并进行编辑 - 理论上,服务器Ant build.xml可以将模板文件复制到服务器x.props(如果它不存在)。

但那并没有发生。我尝试使用目标:

 <target name="x-props-file" unless="prop1" description="create a  
      local.properties file if it doesn't exist">
    <copy file="x.props.template" tofile="x.props" />     
  </target>

但是在路径设置之后它被称为。

我尝试将文件创建为条件:

 <condition available="x.props">
    <not>
      <copy file="x.props.template" tofile="x.props" />  
    </not>
</condition>

但是&#39;不是&#39;和&#39;条件&#39;不要复制。

如果找不到文件,

loadProperties将失败 - 但它不会复制文件。

理想情况下,我希望能够在初始文件加载失败后立即复制新的x.props。

有什么方法吗?

ant 1.1版 java 7

由于

1 个答案:

答案 0 :(得分:2)

使用ant-contrib <if>任务可能最简单:

<if>
  <not>
    <available file="x.props" />
  </not>
  <then>
    <copy file="x.props.template" tofile="x.props" />
  </then>
</if>

编辑:我刚刚重新发现了我在几年前添加评论后给出的答案,并意识到这是一个更好的解决方案,并不依赖于ant-contrib。对原版海报有很大用处可能为时已晚,但我认为无论如何我都会提供它以防万一:

<property file="x.props" />

<property name="prop1" value="something" />
<property name="prop1" value="somethingElse" />

<path id="project.class.path">
    <pathelement location="${prop1}/important.jar"/>
    <pathelement location="${prop2}/anotherImportant.jar"/>
</path>

无需额外的模板文件。只是尝试首先加载属性文件并在此之后立即设置默认值,利用Ant的固有属性不变性。

相反,如果你真的想使用一个单独的属性文件来保存你的默认值,只需执行与上面相同的操作,但用另一个属性文件load替换各个属性赋值:

<property file="x.props" />
<property file="default.props" />