关于这部分蚂蚁脚本的一些澄清?

时间:2013-10-04 16:15:00

标签: java ant

我正在研究 ant 是如何工作的,我对它有一些疑问。我有一个以这种方式开头的ant xml脚本定义文件:

<?xml version="1.0"?>
<project name="Peacock Engine" default="default">       <!-- "default" is the default target -->

<tstamp />

<!-- ============================================ -->
<!-- Load build properties                        -->
<!-- ============================================ -->

<property name="project.buildfile" value="build.num" />

<property file="${project.buildfile}" />

<property file="info.properties" />

<!-- ============================================ -->
<!-- Specify the classpath                        -->
<!-- ============================================ -->

<path id="project.classpath">
    <fileset dir="${project.libdir}">
        <include name="${project.libs}" />
    </fileset>
</path>

<!-- ============================================ -->
<!-- The default target                           -->
<!-- ============================================ -->

<target name="default" depends="jar"/>

现在帮我分析一下:

1)项目标记是根目标,我用它来指定项目属性。

2) :这行究竟是什么?

3)然后我有这些线:

<property name="project.buildfile" value="build.num" />
<property file="${project.buildfile}" />
<property file="info.properties" />

到底是做什么的?我认为第一行创建类似名为 project.buildfile 的变量,并在其中加载名为 build.num 的文件的内容 关于以下两行,我对他们做的事情几乎一无所知......你能帮助我吗?

4)然后在蚂蚁脚本中我找到了这些行:

<!-- ============================================ -->
<!-- Specify the classpath                        -->
<!-- ============================================ -->

<path id="project.classpath">
    <fileset dir="${project.libdir}">
        <include name="${project.libs}" />
    </fileset>
</path>

我试图在网上搜索,但我完全不知道这个部分

5)Finnslly我有这个部分是默认目标的定义,这是我在启动ant脚本时执行的默认操作,指定了特定任务(特定目标):

<!-- ============================================ -->
<!-- The default target                           -->
<!-- ============================================ -->

<target name="default" depends="jar"/>

我对此并不完全确定,但我认为通过这一行,我认为ant脚本的默认行为是编译程序,并将编译好的程序放在Jar文件中。

有人可以帮助我更好地理解这个脚本代码吗?

TNX

安德烈

4 个答案:

答案 0 :(得分:3)

1)和2)这将项目名称设置为“Peacock Engine”,并将默认任务设置为名为“default”的任务(参见5))。如果在不提供特定任务的情况下调用Ant,则将执行默认任务:

<project name="Peacock Engine" default="default">

3)<property name="project.buildfile" value="build.num" />创建一个属性,您可以使用${project.buildfile}访问Ant文件中的任何位置。该属性的值为build.num

<property file="${project.buildfile}" />使用上面定义的属性。它基本上加载文件“build.num”,并使该文件中定义的所有属性可供进一步使用。属性文件如何工作? Have a look at the ant documentation of the property file task

<property file="info.properties" />加载另一个名为“info.properties”的属性文件,并使该文件中的所有属性都可用于Ant。

4)

<path id="project.classpath">
    <fileset dir="${project.libdir}">
        <include name="${project.libs}" />
    </fileset>
</path>

此标记定义类路径。 path标记包含文件集。该文件集包括${project.libdir}中包含名称${project.libs}的所有库。两者都是可能通过包含上面的属性文件来定义的变量。 实际上,此标记为您提供了一组库,这些库可以通过引用它的id(project.classpath)包含在构建文件中的任何位置。

5)<target name="default" depends="jar"/>见1)。当没有提供目标时,项目标记将此目标引用为默认目标。该目标还有另一个目标。 “depends”中命名的目标将在“default”之前执行。同样,如果“jar”具有它所依赖的另一个目标,则首先执行该目标,依此类推。这是一个“调用图”。有关详细信息,请参阅documentation on targets

您可能希望查看writing a simple build file的Ant文档作为更熟悉Ant的起点。

答案 1 :(得分:1)

  

1)项目标签是根目标,我用它来指定项目属性。

项目标签只是命名项目,您还定义了默认目标。项目标签本身不是目标。

<property name="project.buildfile" value="build.num" />

创建名为project.buildfile的属性,并将值设置为&#39; build.num&#39;

<property file="${project.buildfile}" />

从文件中读取一组属性,其名称存储在属性project.buildfile中,其值在这种情况下为&#39; build.num&#39;。

<property file="info.properties" />

从名为&#39; info.properties&#39;

的文件中读取一组属性
<path id="project.classpath">
    <fileset dir="${project.libdir}">
        <include name="${project.libs}" />
    </fileset>
</path>

创建path名为&#39; project.classpath&#39;。该路径将在projectlib.dir属性中定义根,并包含project.libs属性中定义的所有文件

<target name="default" depends="jar"/>

表示目标default取决于首先成功完成的目标jar。 Ant将自动运行jar目标以满足此要求。

Apache维护manual for Ant here

答案 2 :(得分:1)

你应该去Ant Manual并仔细阅读。它可以帮助您理解您的许多问题。

项目线

Ant文件是XML文件,XML文件具有 root 实体,该实体包含所有其他实体。这就是<project>实体。这是一个简单的Ant build.xml文件:

<project>
    <echo message="Hello, World!"/>
</project>

此文件中的唯一任务(<echo>)包含在<project> XML实体中。

<project>实体可以采用以下属性:

  • name :Ant项目的名称。这可以在${ant.project.name}属性中找到。
  • default :您要执行的默认目标。 Ant基本上有两级层次结构。有目标,还有任务目标是您要执行的(编译,打包,执行,清理等),目标包含完成您想要执行的任务。
  • basedir :指定目录时使用的基本目录。默认为当前目录。
  • XML Namespaces :暂时不要担心这个问题。在你对Ant更加熟悉之前,你不会使用它。

属性行:

  

然后我有这些线:

<property name="project.buildfile" value="build.num" />
<property file="${project.buildfile}" />
<property file="info.properties" />

Ant使用名为 properties 的东西,您可以将其视为变量。但是,一旦设置了属性,就无法更改。例如:

<property name="foo" value="This is the initial value of foo"/>
<property name="foo" value="This is my new value"/>

第一行将${foo}设置为这是foo的初始值。第二行什么也没做。事实上,它不会失败或任何东西。它根本不会重置值。

您可以通过创建Ant将在构建发生之前首先读取的属性文件来调整构建系统。第一行将名为${project.buildfile}的属性设置为文件build.num。这是内部版本号。第二行读入此文件中的所有属性并设置其值。第三行读入可能设置其他属性的另一个属性文件。这是一个简单的例子:

<project>
    <property file="build.num"/>
    <property name="build.number" value="Not Set"/>
    <echo message="The build number is ${build.number}"/>
</project>

假设没有名为build.num的文件。在这种情况下,${build.number}设置为Not Set,构建文件将打印出来:

The build number is Not Set

现在,让我们创建一个名为build.num的文件,它就是:

build.number = 1234

现在,当我运行构建时,它将从build.number文件中读取属性build.num。由于<property name="build.number" value="Not Set"/>已经设置,因此The build number is 1234 不会更改内部版本号。该版本现在将打印出来:

$ ant -Dbuild.number=9876

现在,让我说我像这样运行我的构建:

${build.number}

我在命令行上设置了build.num。该构建仍会在文件${build.number}中读取,但由于我已经设置了它,因此不会从中设置<property name="build.number" value="Not Set"/>。由于${build.number}已设置,因此也会忽略该行<!-- ============================================ --> <!-- Specify the classpath --> <!-- ============================================ --> <path id="project.classpath"> <fileset dir="${project.libdir}"> <include name="${project.libs}" /> </fileset> </path>

路径

  

然后在蚂蚁脚本中我找到了这些行:

PATH

Ant中有两种类型的数据。一个是我上面提到的属性。另一个是路径。 Path是一系列文件或目录。您可以在Unix和Windows中看到$ echo $PATH $ /bin:/usr/bin:/usr/local/bin:/home/david/bin 环境变量:

CLASS_PATH

如果我输入命令,操作系统将搜索PATH中的每个目录以查找该命令。在Java中,您拥有project.classpath,它们是您编译项目所需的jar。

这是设置名为<fileset>路径。它基本上需要所有符合<target name="default" depends="jar"/> 条件的jar并将它们放在路径中,以后可以使用,也许用于编译。

目标:

compile

正如我前面提到的,Ant有两级层次结构:目标是你想要完成的事情。将它们视为一个程序。 <target name="test" depends="compile"> .... </target> 目标是用于编译代码的程序。目标包含运行目标时需要执行的任务

某些任务取决于其他任务。例如,测试我的代码的目标将取决于编译代码的目标。没有它首先编译我无法测试我的代码:

all

有些目标只是指定其他目标。例如,我有一个名为<target name="all" depends="clean,compile,test,package"/> 的目标。这将运行目标 clean up我的目录结构并删除任何以前构建的文件,编译我的代码,运行测试,然后打包我的代码:

all

all目标本身不会做任何事情。这只是将所有其他目标组合成一个易于使用的目标的一种方法。我运行default,完成构建所需的一切都已完成。

在这种情况下,开发人员正在定义一个名为jar的目标,该目标运行<project>目标。您可以在他们的default实体中看到此项目的默认目标名为default,因此如果我在未指定目标的情况下运行Ant,它将运行default="jar"目标。

这有点令人费解。开发人员可以将其删除,只需在<project>实体中设置{{1}}。

正如我之前提到的,转到Ant Manual,它将帮助您学习Ant。另外,为您提供一个参考,您可以用它来了解有关这些不同任务的更多信息。

答案 3 :(得分:0)

Dude Maven是这个街区的新生儿。试试吧,你不需要ANT。我已经使用它一个月了,不再回到ANT了。有很多关于如何在项目中使用它的在线教程。 Maven Website