我可以在Ant脚本中声明和初始化变量吗?

时间:2013-10-21 14:15:42

标签: java ant

在Ant中,我可以创建一个包含类似路径的变量的目标吗?

例如,类似以下伪目标:

<target name="initPath">
    Path = "${basedir}/../../myProject/Project/"
</target>

路径是我的变量,并初始化为特定值。

我该怎么做?

3 个答案:

答案 0 :(得分:8)

Ant构建脚本是用XML编写的。要创建属性,必须采用XML样式,而不是:

some_prop="some value"

就是这样:

<property name="some_prop"  value="some value"/>

属性可以包含句点,我建议将它们用作名称分隔符:

<property name="some.prop"  value="some value"/>

你如何申报常数?这里:

<property name="some.prop"  value="some value"/>

那是因为一旦设置了属性,就无法更改。

这样,您可以这样做:

<property file="${basedir}/build.properties"/>
<property name="some.prop" value="some value"/>

假设build.properties文件包含以下行:

some.prop="Some other value"/>

现在,当您运行Ant构建文件时,some.prop的值将为“其他值”,<property name="some.prop" value="some value"/>将不会更改它。我甚至可以这样做:

$ ant -Dsome.prop="A completely different value"

some.prop属性的这个值将覆盖我在build.properties文件中的内容以及我在Ant构建文件中的内容。

这是一个非常好的功能。它允许我设置开发人员可以覆盖的默认值:

<property name="copy.verbose"  value="false"/>
...
<copy todir="${copy.to.dir}"
    verbose="${copy.verbose}">
    <fileset dir="${copy.from.dir}"/>
</copy>

默认情况下,当我的copy任务运行时,它以非详细模式运行,这就是我想要的。但是,假设我的构建存在一些问题,我想确切地看到正在复制的内容,我可以这样做:

$ ant -Dcopy.verbose=true

而且,现在我的复制任务将显示所有正在复制的文件。


路径是一种在命令行中声明$CLASSPATH$PATH之类的方法。您可以使用id预先声明路径,然后再使用它:

<javac destdir="${main.destdir}"
    srcdir="${main.srcdir}">
    <classpath>
        <fileset dir="${lib.dir}">
            <include name="*.jar"/>
        </fileset>
    </classpath>
</javac>

这里我添加了一个类路径。这是使用<fileset/>根据我${lib.dir}目录中的所有jar创建一个类路径。

我也可以这样做:

<path id="main.classpath">
    <fileset dir="${lib.dir}">
        <include name="*.jar"/>
    </fileset>
</path>

<javac destdir="${main.destdir}"
    srcdir="${main.srcdir}"
    classpathref="main.classpath"/>

在这里,我预先声明了我的main.classpath,然后在我的<javac>任务中使用它。

您应该在在线Ant手册中阅读Ant。手册中有一个半体面的介绍,可能有助于为您澄清一些问题。

答案 1 :(得分:0)

以下是在Ant脚本中定义property的方法。

不幸的是,它不是一个变量,因为它们是不可变的。您可以为其设置值,但在脚本执行期间无法更改它。

Here您可以看到为属性分配值的示例。

更新。 您可以使用路径task。例如:

    <path id="combinedPath">
        <path path="${toString:oldPath}"/>
        <path path="my.jar"/>
    </path>

    <path id="reanamePath">
        <path path="${toString:oldPath}"/>
    </path>

如果你在一个目标中改变路径,你肯定可以在另一个目标中访问它。

答案 2 :(得分:0)

Ant有classpath-like support built-in

通常,您不会使用属性来实现此功能。

请考虑阅读Ant文档;这是Ant 101,如果你花一些时间在文档上并弄清楚Ant的做事方式,那么从长远来看它会更快。