2011-07-13 64 views
21

我需要一些帮助来使用Ant的属性文件。我有以下几点:读取Ant build.xml中的.properties文件

  1. 一个build.properties文件。该文件包含一条 信息:on=1

  2. ant.xml文件。该文件包含我的构建说明。

我想读on属性从我的属性文件,如果该值是1我想在我的构建文件执行任务。否则,我希望它什么都不做。任何人都可以指导我如何做到这一点?

+0

你什么意思,你想做些什么?即时通讯假设与ant.xml? – RMT

回答

0

的一种方法,这看起来很难,但是,其实很简单:写一个定制Ant任务(一个简单的java类,< 20行代码)。该任务将

  1. 读取属性文件(位置/名称可以作为任务属性传递)
  2. on值分配给蚂蚁财产

然后你就可以使用您的流量控制的蚂蚁属性。

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>就是这样。

+0

当您可以在Ant脚本中导入属性文件时,您为什么需要这样做? – Perception

+1

@Perception - 你为什么不从这些有价值的信息做出答案?自定义蚂蚁任务肯定更有趣:) –

+0

更有趣的是使用Java API为Ant编写自己的构建工具。我已经提交了一个答案,诚恳地要求:-) – Perception

20

这应该是所有你需要做的:

1.Grab ant-contrib JAR文件的最新版本,并发生在LIB你的Ant安装 文件夹中。

2.Include你在构建脚本

<property file="build.properties"/> 

3.添加下面的taskdef进入构建脚本性能

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

4.And然后最后,如果任务像这样定义:

<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> 

请注意,您可以在从属性f导入的属性中预先标识标识符尔斯。因此,例如,你可以做你的进口,像这样:

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

然后你会在你的文件,“uniqueprefix.on“上”引用,而不是只。

<equals arg1="${uniqueprefix.on}" arg2="1" /> 

您可以使用内置的蚂蚁条件的任务,但是我有一种感觉,如果你需要它,你都与蚂蚁的contrib带来的表的附加功能更好。此外,请注意其标准命名您的构建文件为'build.xml',而不是'ant.xml'。事实上,鉴于您使用的名称,Ant将无法自动找到它。祝你好运。

+0

+1,我接受它,但是 - 对于这个解决方案,我们必须小心,应该为这些外部属性选择一个特殊的命名空间 - 否则我们可能会覆盖现有的属性意外。试想一下,属性'on'也是在'build.xml'中定义的... –

+1

@Andreas_D,它实际上可以为通过属性文件包含的所有属性附加一个唯一标识符。我会更新我的答案以包含此信息。 – Perception

3

对我来说,你想实现类似下面给出的任务。

<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> 

让我知道如果你想要一个解释,在细节。

+0

thx非常。但我仍然有问题。没有考虑来自一般物业的价值“on”。如果我将“开”改为“关”蚂蚁调用任务b,但如果我将任何数字分配给“开”,taska始终运行。 – user842650

3

如果你不想写自己的Ant任务或使用其他库,只是“干净”的蚂蚁,看看这个例子:

mybuild.properties:

on=on 

使用或者真的或类似的东西,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> 
+0

谢谢大家:))它的工作。我会继续我的项目! :* – user842650