0

我正在研究蚂蚁是如何工作的,对此我有一些疑问。我有一个以这种方式开始的 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 文件中。

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

肿瘤坏死因子

安德烈亚

4

4 回答 4

3

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

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

3)<property name="project.buildfile" value="build.num" />创建一个属性,您可以使用${project.buildfile}. 该物业的价值将为build.num

<property file="${project.buildfile}" />利用上述定义的属性。它基本上加载文件“build.num”并使该文件中定义的所有属性可供进一步使用。属性文件如何工作?查看属性文件任务的 ant 文档

<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”有另一个它依赖的目标,这个目标将首先执行,依此类推。这是一个“调用图”。有关这方面的更多信息,请参阅有关目标的文档。

您可能希望查看 Ant 文档,以编写一个简单的构建文件作为开始熟悉 Ant。

于 2013-10-04T16:37:16.913 回答
1

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

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

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

创建一个名为的属性并将project.buildfile值设置为“build.num”

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

从文件中读取一组属性,其名称存储在 propertyproject.buildfile中,在这种情况下,其值是“build.num”。

<property file="info.properties" />

从名为“info.properties”的文件中读取一组属性

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

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

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

意味着目标default取决于目标jar首先成功完成。Ant 会jar自动运行目标来满足这个要求。

Apache在此处维护了 Ant 手册

于 2013-10-04T16:44:40.990 回答
1

你应该去Ant Manual并阅读它。它会帮助你理解你的许多问题。

项目线

Ant 文件是 XML 文件,而 XML 文件有一个包含所有其他实体的实体。这就是<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 使用一种称为属性的东西,您可以将其视为变量。但是,一旦设置了属性,就无法更改它。例如:

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

第一行设置${foo}This is the initial value 的 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.numberbuild.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}已经设置。

小路

然后在 ant 脚本中我找到这些行:

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

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

Ant 中有两种类型的数据。一个是我上面提到的属性。另一个是路径。路径是一系列文件或目录。您可以在 Unix 和 Windows 中使用PATH环境变量看到这一点:

$ echo $PATH
$ /bin:/usr/bin:/usr/local/bin:/home/david/bin

如果我输入一个命令,操作系统将在 PATH 中搜索我的每个目录以找到该命令。在 Java 中,您拥有CLASS_PATH编译项目所需的 jar。

这是设置一个名为project.classpath. 它基本上将所有符合<fileset>条件的 jar 放入一个以后可以使用的路径中,可能用于编译。

目标:

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

正如我之前提到的,Ant 有两个层次结构: 目标是您想要完成的事情。把它们想象成一个程序。compile目标是编译代码的程序。目标包含运行目标所需完成的任务

一些任务依赖于其他任务。例如,测试我的代码的目标将依赖于编译代码的目标。如果不先编译,我将无法测试我的代码:

<target name="test" depends="compile">
    ....
</target>

一些目标只是指定其他目标。例如,我有一个名为all. 这将运行目标以清理我的目录结构并删除任何以前构建的文件,编译我的代码,运行测试,然后打包我的代码:

<target name="all" depends="clean,compile,test,package"/>

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

在这种情况下,开发人员正在定义一个名为default运行该目标的jar目标。你可以在他们的<project>实体中看到这个项目的默认目标被调用default,所以如果我在没有指定目标的情况下运行 Ant,它将运行default目标。

这有点令人费解。开发人员可以忽略这一点,只需default="jar"<project>实体中进行设置。

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

于 2013-10-04T17:26:08.383 回答
0

Dude Maven 是新来的。尝试一下,您将不需要 ANT。我已经使用它一个月了,不再使用 ANT。网上有很多关于如何在项目中使用它的教程。Maven 网站

于 2013-10-04T18:16:43.710 回答