ANT(自动构件工具)学习笔记

可能有些读者并不连接什么是 Ant 以及入可使用它,但只要使用通过 Linux 系统得读者,应该知道 make 这个命令。当编译 Linux 内核及一些软件的源程序时,经常要用这个命令。Make 命令其实就 是一个项目管理工具,而 Ant 所实现功能与此类似。像 make, gnumake和 nmake 这些编译工具都有 一定的缺陷,但是 Ant 却克服了这些工具的缺陷。最初 Ant 开发者在开发跨平台的应用时,用样也 是基于这些缺陷对 Ant 做了更好的设计。

Ant的概念

可能有些读者并不连接什么是 Ant 以及入可使用它,但只要使用通过 Linux 系统得读者,应该知道 make 这个命令。当编译 Linux 内核及一些软件的源程序时,经常要用这个命令。Make 命令其实就 是一个项目管理工具,而 Ant 所实现功能与此类似。像 make, gnumake和 nmake 这些编译工具都有 一定的缺陷,但是 Ant 却克服了这些工具的缺陷。最初 Ant 开发者在开发跨平台的应用时,用样也 是基于这些缺陷对 Ant 做了更好的设计。

Ant与makefile

Makefile 有一些不足之处,比如很多人都会碰到的烦人的 Tab 问题。最初的 Ant 开发者多次强调” 只是我在 Tab 前面加了一个空格,所以我的命令就不能执行”。有一些工具在一定程度上解决了 这个问题,但还是有很多其他的问题。 Ant 则与一般基于命令的工具有所不同,它是 Java 类的扩 展。 Ant 运行需要的 XML 格式的文件不是 Shell 命令文件。它是一个 Project 组成的,而一个 Project 又可分成可多 target, target 再细分又分成很多 task,每一个 task 都是通过一个实现特 定接口的 java 类来完成的。

Ant 的优点

Ant 是 Apache 软件基金会 JAKARTA 目录中的一个子项目,它有以下的优点。跨平台性。Ant 是存 Java 语言编写的,所示具有很好的跨平台性。操作简单。 Ant 是由一个内置任务和可选任务组成的。 Ant 运行时需要一个 XML 文件(构建文件)。 Ant 通过调用 target 树,就可以执行各种 task。每个 task 实现了特定接口对象。由于 Ant 构建文件 时 XML 格式的文件,所以和容易维护和书写,而且结构很清晰。 Ant 可以集成到开发环境中。由于 Ant 的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。

Ant开发

Ant的构建文件

当开始一个新的项目时,首先应该编写 Ant 构建文件。构建文件定义了构建过程,并被团队开发 中每个人使用。 Ant 构建文件默认名为 build.xml,也可以取其他的名字。只不过在运行的时候 把这个命名当作参数传给 Ant。构建文件可以放在任何的位置。一般做法是放在项目顶层目录中。 这样可以保持项目的简洁和清晰。下面是一个典型的项目层次结构。

(1) src 存放文件。

(2) class 存放编译后的文件。

(3) lib 存放第三方 JAR 包。

(4) dist 存放打包,发布以后的代码。

Ant构建文件是 XML 文件。每个构建文件定义一个唯一的项目(Project 元素)。每个项目下可以定 义很多目标(target 元素),这些目标之间可以有依赖关系。当执行这类目标时,需要执行他们所 依赖的目标。每个目标中可以定义多个任务,目标中还定义了所要执行的任务序列。Ant在构建目标时必须调 用所定义的任务。任务定义了 Ant 实际执行的命令。 Ant 中的任务可以为 3 类。

(1) 核心任务。核心任务是 Ant 自带的任务。

(2) 可选任务。可选任务实来自第三方的任务,因此需要一个附加的 JAR 文件。

(3) 用户自定义的任务。用户自定义的任务实用户自己开发的任务。

Apache Ant 是一个基于 Java 的生成工具。最初创始人 James Duncan Davidson全名: Another Neat Tool(另一个整洁的工具)的首字母缩写。ttp://ant.apache.org/bindownload.cgi 下载 Ant 的地址 zip 包解压 zip 包(目录结构):

ANT(自动构件工具)学习笔记

要使用 Ant,需要将 Ant 添加到 PATH 下面:

path : Ant 的 bin 目录。

ANT(自动构件工具)学习笔记

ANT_HOME: bin 所处的目录,即 Ant 的主目录。

ANT(自动构件工具)学习笔记

测试 Ant 安装是否成功:在 dos 下输入 ant 命令,如果出现如下界面,则搭建成功。

ANT(自动构件工具)学习笔记

第一个简单的 Ant 实例 build.xml。默认 Ant 的文件是 build.xml

<?xml version="1.0" encoding="UTF-8">
<project default="init">
    <target name="init">
        <!-- 创建一个或多个目录 -->
        <mkdir dir="temp"/>
        <mkdir dir="a\b\c\d"/>
        <!-- 删除一个或多个目录 -->
        <delete dir="temp"/>
        <delete dir="a\b\c\d"/>
    </target>
</project>

运行:

ant 运行当前目录下的 build.xml 文件(默认 build.xml)

ant build.xml 运行显示指定的 build.xml 文件

ant –f hello.xml 运行指定的 hello.xml 文件,其中的-f 为(buildfile)

ant –f build.xml init 运行指定 build.xml 中的 init 目标

ant init 运行默认 build.xml 中的 init 目标

ant init second 运行默认 build.xml 中的 init 和second 目标,有序的。

<project>标签

每个构建文件对应一个项目。<project>标签是构建文件的根标签。它可以有多个内在属性。

(1) default 表示默认的运行目标,即指定默认的 target(即任务)。 这个属性是必须的。

(2) basedir 表示项目的基目录。

(3) name 表示项目名。

(4) description 表示项目的描述。

每个构建文件都对应于一个项目,但是大型项目经常包含大量的子项目,每一个子项目都可以有自己的构建文件。

<?xml version="1.0" encoding="UTF-8">
<project name="ProjectName" default="init" basedir=".">
    <description>项目描述信息</description>
    <target name="init">
        <!-- 目标中要做的事情 -->
    </target>
</project>

<target>标签

一个项目标签(<project>)下可以有一个或多个 target 标签。一个 target 标签可以依赖其他的 target 标签。例 如,有一个 target 用于编译程序,另一个 target 用于声称可执行文件。在生成可执行文件之前必 须先编译该文件,因此可执行文件的 target 依赖于编译程序的target。 Target 的所有属性如下。

(1) name 表示标明,这个属性是必须的。

(2) depends 表示依赖的目标。

(3) if 表示仅当属性设置时才执行。

(4) unless 表示当属性没有设置时才执行。

(5) description 表示项目的描述。

Ant的 depends 属性指定了 target 的执行顺序。Ant 会依照 depends 属性中 target 出现顺序依次执行 每个 target。在执行之前,首先需要执行它所依赖的 target。程序中的名为 run的 target 的 depends 属性 compile,而名为 compile 的 target 的 depends 属性是 prepare,所以这几个 target 执 行的顺序是 prepare->compile->run。一个 target 只能被执行一次,即使有多个 target 依赖于它。如果没有 if 或 unless 属性 target 总 会被执行。 

<?xml version="1.0" encoding="UTF-8">
<project default="second">
    <target name="init">
        <mkdir dir="hello"/>
        <mkdir dir="world"/>
    </target>
    
    <target name="second" depends="init">
        <delete dir="hello"/>
        <delete dir="world"/>
    </target>
</project>

<property>标签

表示定义一个属性。使用属性用${属性名称}的形式使用。如:

<?xml version="1.0" encoding="UTF-8">
<project name="ProjectName" default="init" basedir=".">
    <property name="test" value="HelloWrold" />
    
    <target name="init">
        <mkdir dir="${test}"/>
    </target>
</project>

以上定义了一个名称为 test 的属性,然后使用<mkdir>标签创建一个文件夹,文件夹为HelloWorld。

定义过的属性可以作为其他属性的值。如:

<?xml version="1.0" encoding="UTF-8">
<project default="init">
    <property name="dir" value="helloWorld"/>
    <property name="hello" value="${dir}/db"/>
    
    <target name="init">
        <mkdir dir="${hello}"/>
    </target>
</project>

<mkdir>标签

该标签用于创建一个目录,它有一个属性 dir 用来指定所创建的目录名,其代码如下:

<?xml version="1.0" encoding="UTF-8">
<project name="ProjectName" default="init" basedir=".">
    <property name="dir" value="helloWorld"/>
    <property name="hello" value="${dir}/db"/>
    
    <target name="init">
        <mkdir dir="${hello}"/>
    </target>
</project>

<copy>标签

该标签用于文件或文件集的拷贝,其属性如下。

(1) file 表示源文件。

(2) tofile 表示目标文件。

(3) todir 表示目标目录。

(4) overwrite 表示指定是否覆盖目标文件,默认值是不覆盖。

(5) includeEmptyDirs 表示指定是否拷贝空目录,默认值为拷贝。

(6) failonerror 表示指定如目标没有发现是否自动停止,默认值是停止。

(7) verbose 表示制定是否显示详细信息,默认值不显示。

<?xml version="1.0" encoding="UTF-8">
<project name="ProjectName" default="init" basedir=".">
    <!-- 目标文件 -->
    <property name="destFile" value="destFile.txt"/>
    <!-- 源文件 -->
    <property name="srcFile" value="toFile.txt"/>
    
    <target name="init">
        <copy file="${srcFile}" tofile="${destFile}" />
    </target>
</project>

以上是复制单个文件。将 toFile.txt 文件复制到 destFile.txt 文件。如果 destFile.txt 文件不存在,则创建 destFile.txt 文件。

<delete>标签

该标签用于删除一个文件或一组文件,去属性如下。

(1) file 表示要删除的文件。

(2) dir 表示要删除的目录。

(3) includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。

(4) failonerror 表示指定当碰到错误是否停止,默认值是自动停止。

(5) verbose 表示指定是否列出所删除的文件,默认值为不列出。

<?xml version="1.0" encoding="UTF-8">
<project name="ProjectName" default="init" basedir=".">
    <property name="file" value="destFile.txt"/>
    <target name="init">
        <delete file="${file}" />
    </target>
</project>

以上代码删除 toFile.txt 文件。

<?xml version="1.0" encoding="UTF-8">
<project name="ProjectName" default="init" basedir=".">
    <property name="dir" value="dir/a/b"/>
    <target name="init">
        <delete dir="${dir}" />
    </target>
</project>

以上代码删除 HelloWorld 目录。

<jar>标签

该标签用来生成一个 JAR 文件,其属性如下。

(1) destfile 表示 JAR 文件名。

(2) basedir 表示被归档的文件名。

(3) includes 表示包含归档的文件。

(4) exchudes 表示排除的文件。

<?xml version="1.0" encoding="UTF-8">
<project name="ProjectName" default="excute" basedir=".">
    <!-- 存放jar文件的目录 -->
    <property name="destJar" value="newDir"/>
    <!-- 存放字节码文件目录 -->
    <property name="complieFile" value="complie"/>
    <!-- 存放java文件的目录 -->
    <property name="src" value="src"/>
    
    <!-- 创建目录 -->
    <target name="init">
        <mkdir dir="${destJar}"/>
        <mkdir dir="${complieFile}"/>
        <mkdir dir="${src}"/>
    </target>
    
    <!-- 编译源文件 -->
    <target name="complie" depends="init">
        <javac destdir="${complieFile}" srcdir="${src}"/>
    </target>
    
    <!-- 生成jar文件 -->
    <target name="excute" depends="complie">
        <jar destdir="${destJar}/myTest.jar" basedir="${complieFile}"/>
    </target>
</project>

以上代码将 src 目录下的 java 文件进行编译,编译后的 class 文件存放在 complie目录下面,然后将 complie 目录下的 class 文件生成 jar 文件。 Jar 文件存放在 newDir 目录下。上面建立了三个目标,分别是 init、 complie、 excute。 Init 目标用于创建存放 jar、 class 等目录。如果存在,则不执行。 Complie 目标执行编译操作。 Excute 目标执行打包 jar 文件。

<?xml version="1.0" encoding="UTF-8">
<project name="ProjectName" default="excute" basedir=".">
    <!-- 存放字节码文件目录 -->
    <property name="complie" value="complie"/>
    <!-- 存放java文件的目录 -->
    <property name="dest" value="dest"/>
    
    <!-- 创建目录 -->
    <target name="init">
        <mkdir dir="${complie}"/>
        <mkdir dir="${dest}"/>
    </target>
    
    <!-- 编译源文件 -->
    <target name="complie" depends="init">
        <javac destdir="${complieFile}" srcdir="${src}"/>
    </target>
    
    <!-- 生成jar文件 -->
    <target name="excute" depends="complie">
        <jar destdir="${destJar}/myTest.jar" basedir="${complieFile}">
            <manifest>
                <attribute name="Built-By" value="${user.name}"/>
                <attribute name="Main-Class" value="com.test.TestMain"/>
            </manifest>
        </jar>
    </target>
</project>

以上代码的 17 到 20 行为 jar 文件提供了一个清单文件。如果是 swing 程序,双击 jar 即可运行。 Main-Class 指定了程序入口。 ${ user.name}获取登录系统的用户名称。

<javac>标签

该标签用于编译一个或一组 java 文件,其属性如下。

(1) srcdir 表示源程序的目录。

(2) destdir 表示 class 文件的输出目录。

(3) include 表示被编译的文件的模式。

(4) excludes 表示被排除的文件的模式。

(5) classpath 表示所使用的类路径。

(6) debug 表示包含的调试信息。

(7) optimize 表示是否使用优化。

(8) verbose 表示提供详细的输出信息。

(9) fileonerror 表示当碰到错误就自动停止

<?xml version="1.0" encoding="UTF-8">

<project name="ProjectName" default="excute" basedir=".">
    <!-- 存放字节码文件目录 -->
    <property name="complie" value="complie"/>
    <!-- 存放java文件的目录 -->
    <property name="dest" value="dest"/>
    
    <!-- 创建目录 -->
    <target name="init">
        <mkdir dir="${complie}"/>
        <mkdir dir="${dest}"/>
    </target>
    
    <!-- 编译源文件 -->
    <target name="complie" depends="init">
        <javac destdir="${complieFile}" srcdir="${src}"/>
    </target>
    
    <!-- 生成jar文件 -->
    <target name="excute" depends="complie">
        <jar destdir="${destJar}/myTest.jar" basedir="${complieFile}" />
    </target>
</project>

location 属性

该属性常用于引用文件系统上的文件或目录,但是对于使用不同的路径分隔符的平台来说,这样可能在跨不同平台是导致问题。如 windows 上以\作为分隔符,在 linux 上以/作为分隔符。 Ant 的 location 属性专门设计用于以平台无关的方式包含文件的系统路径。像下面这样使用 location 来代替 value。如下:

<?xml version="1.0" encoding="UTF-8">
<project name="ProjectName" default="excute" basedir=".">
    <property name="dir" location="a/b/c/d"/>
    <!-- 创建目录 -->
    <target name="init">
        <mkdir dir="${dir}"/>
    </target>
</project>
一寸光阴一寸金,寸金难买寸光阴。——《增广贤文》
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号