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

Posted

技术标签:

【中文标题】从 Ant build.xml 中的 .properties 文件中读取【英文标题】:Reading from .properties file in Ant build.xml 【发布时间】:2011-10-04 11:27:04 【问题描述】:

在使用 Ant 的属性文件方面我需要一些帮助。我有以下内容:

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

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

我想从我的属性文件中读取on 属性,如果值为1,我想在我的构建文件中执行一个任务。否则我希望它什么也不做。谁能指导我如何做到这一点?

【问题讨论】:

什么意思,你想做点什么?我假设 ant.xml 有什么? 【参考方案1】:

一种看似困难但实际上非常简单的方法:编写一个自定义的 ant 任务(一个简单的 java 类,

    读取属性文件(位置/名称可以作为属性传递给任务) 将 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 - 您为什么不从这些有价值的信息中做出回答?自定义蚂蚁任务肯定更有趣:) 更有趣的是为 Ant 编写自己的构建工具,利用它的 Java API。我已按照谦虚的要求提交了答案:-)【参考方案2】:

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

1.获取最新版本的ant-contrib JAR并放入lib Ant 安装文件夹。

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_D,实际上可以将唯一标识符附加到通过属性文件包含的所有属性。我将更新我的答案以包含此信息。【参考方案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>

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

【讨论】:

非常感谢。但我仍然有问题。通常不考虑属性中的“on”值。如果我将“on”更改为“off”,则调用 taskb,但如果我将任何数字分配给“on”,则 taska 始终运行。【参考方案4】:

如果您不想编写自己的 Ant Task 或使用其他库,只需“清理”ant,看看这个:

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

【讨论】:

谢谢大家 :)) its working. Im 继续我的项目! :*

以上是关于从 Ant build.xml 中的 .properties 文件中读取的主要内容,如果未能解决你的问题,请参考以下文章

与 Ant 中的 Build.xml 相关

Ant、Ivy 和 JUnit 找不到类 - build.xml 中的错误?

有啥方法可以从 Eclipse 自动生成 ant build.xml 文件?

有没有从Eclipse自动生成ant build.xml文件的方法?

如何修改Java 9的ANT build.xml中的xjc块?

如何使用 Ant 构建 Android 示例项目? build.xml 不存在