admin管理员组

文章数量:1558101

0 前言

全是干货的技术殿堂

文章收录在我的 GitHub 仓库,欢迎Star/fork:
Java-Interview-Tutorial
https://github/Wasabi1234/Java-Interview-Tutorial

Apache Ant 是由 Java 语言开发的工具,由 Apache 软件基金会所提供。Apache Ant 的配置文件写成 XML 容易维护和书写,而且结构很清晰。

1 简介

Ant 是一个 Apache 基金会下的跨平台的基于 Java 语言开发的构件工具。在我们详细了解 Apache Ant 之前, 让我们来讲解为什么构建工具是需要最先了解的。

构建工具的需求

一般情况,开发人员花费大量的时间做一般性的任务,比如:构建和部署,通常包含下面的工作:

编译代码
封装二进制文件
在测试服务器上部署二进制文件
测试改变
从一个地点拷贝代码到另一个地点
为了自动和简化上面的工作,Apache Ant 是非常有用的。这是一个基于开放的操作系统构建和部署的工具,该工具需要从命令行执行。

Apache Ant 的历史

Ant 是由 James Duncan Davidson 开发的(也就是 Tomcat 最初的开发者)。
最初是用来构建 Tomcat,被作为一个 Tomcat 的发行版的一部分。
Apach Make 工具包的复杂性与诸多问题催生了 Apache Ant。
在 2000 年的时候,Ant 被作为一个独立的项目。最新的 Apache Ant 版本是 2014 年 5 月的 1.9.4 版本。

Apache Ant 的特点

Ant 是最完整的基于 Java 语言开发的构建和部署工具。
Ant 具有平台无关性,可以处理平台特有的属性,诸如文件分隔符。
Ant 还可以用来执行平台特有的任务,比如使用 touch 命令修改一个文件的修改时间。
Ant 脚本是用 XML 来完成的。如果你已经对 XML 有所了解,那么你学习 Ant,将会比较得心应手。
Ant 擅长自动完成重复任务。
Ant 开始需要一系列的预先定义好的任务。
Ant 提供了开发自定义任务的接口。
Ant 可以很容易从命令行调用,并且它能够很好地集成免费和商用的集成开发环境。

2 下载与安装

2.1 homebrew

打开Mac上的终端,并输入下面的命令,然后回车:

brew install ant

就装好Ant了。

2.2 官网下载配置

让配置生效

source ~/.bash_profile

验证配置成功

  • ant -version

3 构建文件

一般来说,Ant 的构建文件默认为 build.xml,放在项目顶层目录中。然而,并没有限制构建文件必须命名为 bulid.xml,也并不限制放在项目顶层目录中。你可以将构建文件命名为其他名字,也可以将它放在项目的其他地方。

这个教程将以简单的方式向你展示如何利用 Apache Ant 来自动地构建和部署项目的过程。在完成本教程的学习以后,你将会发现你已经具备下一阶段学习 Apache Ant 中等水平的专业知识 。

对于下面的练习,创建一个文件命名为 build.xml 的文件,存储在你电脑的任意地方 ,并包含一下的内容:

<?xml version="1.0"?>
   <project name="Hello World Project" default="info">

   <target name="info">
      <echo>Hello World - Welcome to Apache Ant!</echo>
   </target>

</project>

注意到上面的练习中,在 xml 文件的声明前面没有任何空行或者空格。如果你在写 xml 文件的声明时加入了空行或者空格,执行 ant -build 操作时,将会出现下面的错误信息:

The processing instruction target matching “[xX][mM][lL]” is not allowed.
错误信息的意思是:处理指令目标匹配 “[xX][mM][lL]” 不被允许。所有的构建文件需要包含项目元素 (project 标签) 和至少一个目标元素 (target 标签)。

构建文件的项目元素 有 3 个属性:

目标和目标之间可以有依赖关系。举个例子,一个部署 (deploy) 目标可能依赖于封装 (package) 目标,而这个封装目标可能又依赖于编译 (compile) 目标等。依赖关系被表示成依赖属性 (depends)。例如:

<target name="deploy" depends="package">
  ....
</target>

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

<target name="clean" >
  ....
</target>

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

构建文件的目标元素有以下属性:


在上面的例子中 echo 任务主要负责打印消息。在我们的例子中,执行 echo 任务后,打印出 “hello world” 消息。

为了运行 ant 的构建文件,打开命令提示符并导航到 build.xml 建立的文件夹。输入 ant info 命令或者 ant 命令。这两种命令都可以运行,因为 info 是构建文件的默认目标。你讲会看到下面的输出信息:

C:>ant
Buildfile: C:\build.xml

info: [echo] Hello World - Welcome to Apache Ant!

BUILD SUCCESSFUL
Total time: 0 seconds

C:>

4 构建项目

现在我们已经学习了 Ant 的数据类型,是时候在实际过程中运用所学知识了。在这一章节中,我们将会构建一个项目。这一章节的目的是创建一个 Ant build 文件,该文件能够编译 Java 源文件和将这些类文件存储在 WEB-INF\classes 文件夹下。

考虑接下来构建项目的结构:

数据脚本存储在 db 文件夹中。
java 源文件存储在 src 文件夹中。
images (图像),js (JavaScript 脚本),style (css 层叠样式表)存储在 war 文件夹中。
JSPs 文件存储在 jsp 文件夹中。
第三方的 jar 文件存储在 lib 文件夹中。
java 类文件存储在 WEB-INF\classes 文件夹中。
学习完本教程的剩余部分后,就能知道这个项目是一个 Hello World 传真应用。

C:\work\FaxWebApplication>tree
Folder PATH listing
Volume serial number is 00740061 EC1C:ADB1
C:.
+---db
+---src
.  +---faxapp
.  +---dao
.  +---entity
.  +---util
.  +---web
+---war
   +---images
   +---js
   +---META-INF
   +---styles
   +---WEB-INF
      +---classes
      +---jsp
      +---lib

下面给出上述项目的 build.xml 文件的内容。让我们来一条语句接一条语句地来分析它。

<?xml version="1.0"?>
<project name="fax" basedir="." default="build">
   <property name="src.dir" value="src"/>
   <property name="web.dir" value="war"/>
   <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
   <property name="name" value="fax"/>

   <path id="master-classpath">
      <fileset dir="${web.dir}/WEB-INF/lib">
         <include name="*.jar"/>
      </fileset>
      <pathelement path="${build.dir}"/>
   </path>

   <target name="build" description="Compile source tree java files">
      <mkdir dir="${build.dir}"/>
      <javac destdir="${build.dir}" source="1.5" target="1.5">
         <src path="${src.dir}"/>
         <classpath refid="master-classpath"/>
      </javac>
   </target>

   <target name="clean" description="Clean output directories">
      <delete>
         <fileset dir="${build.dir}">
            <include name="**/*.class"/>
         </fileset>
      </delete>
   </target>
</project>

首先,让我们来声明一些源文件,web 文件和构建文件的一些属性信息。

在上面的例子中:

src.dir 表示这个项目的源文件目录,也就是存储 java 文件的地方。
web.dir 表示这个项目的 web 文件目录,也就是存储 JSPs 文件,web.xml,css,javascript 以及其它与 web 相关的文件的地方。
build.dir 表示该项目的输出文件。
属性也可以引用其它属性。在上面的例子中,build.dir 属性引用了 web.dir 属性。

在上面的例子中,src.dir 就是项目源文件存放的地方。

我们项目的默认目标是编译目标。但是首先让我们来看一下 clean 目标。

clean 目标,就像它的名字所表明的意思一样,删除构建文件夹中的所有文件。

<target name="clean" description="Clean output directories">
   <delete>
      <fileset dir="${build.dir}">
         <include name="**/*.class"/>
      </fileset>
   </delete>
</target>

控制类路径 (master-classpath) 保存类路径的相关信息。在这种情况下,它包含了构建文件夹和 jar 文件夹中的所有的类文件。

<path id="master-classpath">
   <fileset dir="${web.dir}/WEB-INF/lib">
      <include name="*.jar"/>
   </fileset>
   <pathelement path="${build.dir}"/>
</path>

最后,构建目标构建这些文件。首先,我们创建一个构建目录,如果该目录不存在,我们就执行 javac 命令(具体以 jdk 1.5 作为我们目标的编译环境)。 我们对 javac 任务提供源文件夹和类路径,并且通过执行 javac 任务将类文件存放在构建文件夹中。

<target name="build" description="Compile main source tree java files">
   <mkdir dir="${build.dir}"/>
   <javac destdir="${build.dir}" source="1.5" target="1.5" debug="true"
      deprecation="false" optimize="false" failonerror="true">
      <src path="${src.dir}"/>
      <classpath refid="master-classpath"/>
   </javac>
</target>

在这个文件上执行 Ant,编译 java 源文件,并将编译后的类文件存放在构建文件夹的地方。

运行 Ant 文件后,能看到以下输出:

C:>ant
Buildfile: C:\build.xml

BUILD SUCCESSFUL
Total time: 6.3 seconds
文件被编译后,将存储在 build.dir 文件夹中。

避坑

  • 注意这里设置了 JDK 的版本,注意和代码版本的对齐!

本文标签: 详解Ant