我正在研究 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
安德烈
答案 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