在Ant的build.xml文件中读取.properties文件

25
我需要关于使用Ant属性文件的帮助。我有以下内容:
  1. 一个 build.properties 文件。这个文件包含一条信息:on=1

  2. 一个 ant.xml 文件。这个文件包含我的构建指令。

我想要从我的属性文件中读取 on 属性,如果值是 1,我想要在我的构建文件中执行一个任务。否则我希望它什么都不做。有人可以指导我如何实现吗?

你的意思是想做什么?我猜你是指ant.xml方面的事情? - RMT
4个回答

24
这就是你需要做的全部内容:
1.获取最新版本的ant-contrib JAR文件,并将其放置在Ant安装目录下的lib文件夹中。
2.在构建脚本中包含你的属性。
<property file="build.properties"/>

3. 将以下的taskdef条目添加到您的构建脚本中

<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>

4. 最后,按以下方式定义if任务:

<if>
 <equals arg1="${on}" arg2="1" />
 <then>
   <echo message="I am going to do something here" />
 </then>
 <else>
   <echo message="I am going to do nothing" />
 </else>
</if>

请注意,您可以在从属性文件中导入的属性前添加标识符。例如,您可以这样导入:

<property file="build.properties" prefix="uniqueprefix"/>

然后你需要在文件中引用 'uniqueprefix.on',而不是仅使用 'on'。

<equals arg1="${uniqueprefix.on}" arg2="1" />
你可以使用Ant的内置条件任务,但我有一个感觉,如果你需要它,最好使用ant-contrib提供的额外函数。此外,请注意将构建文件命名为“build.xml”,而不是“ant.xml”。因为这样,Ant将无法自动定位到它,给你带来好运。

+1 我会接受这个解决方案,不过我们必须小心并选择一个特殊的命名空间来存储这些外部属性,否则可能会意外覆盖现有的属性。想象一下,如果 on 属性也在 build.xml 中定义了... - Andreas Dolk
1
@Andreas_D,可以将唯一标识符附加到通过属性文件包含的所有属性中。我会更新我的答案以包含此信息。 - Perception

5
如果您不想编写自己的Ant任务或使用其他库,只需“清除”Ant,看一下这个:
我的build.properties:
on=on

请使用on或true或类似的内容,1将无法工作。

build.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="default">
    <property file="mybuild.properties"/>    

    <target name="default" depends="on, off" description="description">
        <echo>default</echo>
    </target>

    <target name="on" if="${on}">
      <echo>on</echo>
    </target>

    <target name="off" unless="${on}">
      <echo>off</echo>
    </target>
</project>

谢谢大家:)它正在工作。我将继续推进我的项目!:* - user842650

4
似乎您想实现类似下面给出的任务。
<property file="build.properties" />



<target name="default" description="Homeworks">
    <condition property="on">
        <equals arg1="{on}" arg2="1" />
    </condition>
    <antcall target="taska" />
    <antcall target="taskb" />
</target>

<target name="taska" if="on">
    <echo message="Testing task one" />
</target>
<target name="taskb" unless="on">
    <echo message="Testing task two" />
</target>

如果您需要详细解释,请告诉我。

如需了解更多信息,请告知。


非常感谢。但我仍然有问题。通常情况下,属性中的值“on”不被考虑在内。如果我将“on”更改为“off”并调用taskb,但是如果我将任何数字分配给“on”,taska始终会运行。 - user842650

0
一种看起来很困难但实际上相当简单的方法:编写一个自定义的Ant任务(一个简单的Java类,代码不到20行)。该任务将会:
  1. 读取属性文件(位置/名称可以作为任务的属性传递)
  2. on的值分配给Ant属性
然后,您可以使用该Ant属性进行流程控制。
public class MyOwnTask extends Task {

  private String filename = "build.properties"; // some default value

  public void setFilename(String filename) {
    this.filename = filename;
  }

  public void execute() {   // the "main" method
    Properties p = new Properties();
    p.load(filename);
    String onValue = p.get("on");
    getProject().setProperty("ON_PROPERTY", onValue);
  }
}

然后你只需要一些<taskdef>就可以了。


当你可以在Ant脚本中导入属性文件时,为什么还需要这样做呢? - Perception
1
@Perception - 为什么不利用这些宝贵的信息来回答问题呢?自定义Ant任务肯定更有趣 :) - Andreas Dolk
更有趣的是编写自己的构建工具,利用Ant的Java API。我已经提交了答案,如您所请求的那样谦恭。 - Perception

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接