前言
最近接手了一个老项目,使用Ant进行编译和打包。现在用的都是MAVEN,或者是Gradle。用了就总结一下,都是营养啊。
一、Ant是什么?
Ant是Apache基金下的一个项目,能够就将编译、测试、部署编排在一起实现自动化,类似于Maven的各个生命周期执行过程。
Ant运行的核心是一个XML文件,执行各种target。
二、Ant的使用
1.安装及配置
1.1JDK安装
Ant运行是依赖Java环境的,因此先安装Java环境。
并配置“JAVA_HOME”环境变量。
1.2安装Ant
下载安装包
到官网下载Ant,https://ant.apache.org/bindownload.cgi
这里注意Ant的不同版本对JDK版本是有不同的要求的。
如果本机的JDK版本是8及以上,那么请选择1.10.*版本。
如果本机的JDK版本是8以下,选择1.9.*版本。
配置环境变量
新建ANT_HOME
修改PATH,增加ANT的路径
测试
打开命令行工具,执行ant -version
查看版本
2.使用Ant进行编译打包
2.1创建工程
Authority:权限子模块
Upload:上传子模块
src:java及配置文件汇聚目录
build:编译目录
在工程根目录下,创建build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
build.xml文件:
每个需要构建的项目都要定义一个build.xml文件(默认的名称),对构建过程进行定义
project标签:build.xml文件只能有一个project标签,代表定义一个构建项目
name:项目名称 。
basedir:基准目录,构建过程中的相对路径都会参照这个路径来。按照一般的习惯,build.xml都会放在项目的根目录下,
因此这里使用"."标示当前目录,也就是相对路径的跟都是项目根目录,这样很方便。
default:对应某一个target,当使用该配置文件,运行ant的时候,会把这个target作为执行的入口。
有点类似Maven中指定程序的主文件。
property标签:对属性的定义,共后续的构建步骤中使用。类似于java 的 static final String
name:属性名称,大消息敏感
value:属性值
target标签:一个构建项目可以包含多个target构建目标。一个构建目标,也可以依赖另外一个target构建目标。类似于Maven的goal
name:目标名称
depends:需要依赖的target目标,通过这个属性,也就实现了target的顺序执行
if:表示仅当条件满足的时候才执行target目标
-->
<project name="uip" basedir="." default="makewar">
<!-- 定义代码编译时需要依赖的lib包的路径 -->
<property name="classpath_lib" value="WebApp/WEB-INF/lib" />
<!-- 定义lib包的路径 -->
<path id="classpath">
<fileset dir="${classpath_lib}">
<include name="*.jar" />
</fileset>
</path>
<!--
定义<javac> 的 debuglevel值 。设置编译信息中显示的内容
source:源文件名称
lines:源码中行号信息
vars:方法的局部变量信息
-->
<property name="debuglevel" value="source,lines,vars" />
<property name="target" value="1.8" />
<property name="source" value="1.8" />
<!-- 获取源码路径中源码时候需要去除java文件,在这里配置 -->
<patternset id="no.java">
<exclude name="**/*.java" />
</patternset>
<!--
定义初始化过程
-->
<target name="init">
<property name="build" value="build/">
</property>
<property name="src" value="src">
</property>
<!-- 删除build目录 -->
<delete dir="${build}">
</delete>
<!-- 创建build目录 -->
<mkdir dir="${build}" />
<!-- 创建build\WEB-INF目录 -->
<mkdir dir="${build}\WEB-INF" />
<!-- 创建build\WEB-INF\classes目录 -->
<mkdir dir="${build}\WEB-INF\classes" />
<!-- 创建build\WEB-INF\lib目录 -->
<mkdir dir="${build}\WEB-INF\lib" />
<!-- 拷贝web文件到 build目录下 -->
<copy todir="${build}">
<!-- 获取 WebApp目录下的文件 -->
<fileset dir="${basedir}\WebApp">
<include name="WEB-INF/**" />
<include name="**" />
</fileset>
<!-- 拷贝updateFiles.txt文件 -->
<fileset dir="${basedir}">
<include name="updateFiles.txt" />
</fileset>
</copy>
<!-- 拷贝java代码到src目录下,srcdocument -->
<copy todir="${src}">
<fileset dir="${basedir}/Authority">
<include name="**" />
</fileset>
</copy>
<!-- 拷贝java代码到src目录下,srcfaq -->
<copy todir="${src}">
<fileset dir="${basedir}/Upload">
<include name="**" />
</fileset>
</copy>
<!-- 拷贝配置文件到build/WEB-INF/classes目录下 -->
<copy todir="${build}/WEB-INF/classes">
<!-- 去除java文件 -->
<fileset dir="${src}">
<patternset refid="no.java" />
</fileset>
</copy>
</target>
<!-- 定义complie目标,执行编译工作。依赖init目标 -->
<target name="complie" depends="init">
<!--
用于编译一个或多个Java文件
srcdir:源码路径,这里使用了上文定义的src变量
destdir:编译后的class文件输出的目录
classpathref:所使用的类路径,也就是编译源码的时候,需要依赖的class文件位置
debug:是否打印编译信息,默认是不打印的,如果设置为true,要与debugLevel组合进行设置
debugLevel:输出编译信息的规则
-->
<javac srcdir="${src}" destdir="${build}/WEB-INF/classes" encoding="utf-8" classpathref="classpath" includeantruntime="on">
</javac>
</target>
<!-- 定义makewar目标,执行打包工作。依赖complie目标 -->
<target name="makewar" depends="complie">
<!--
打war包
warfile:war文件定义
webxml:webxml文件位置
-->
<war warfile="AntTest.war" webxml="${build}/WEB-INF/web.xml">
<!-- 需要的lib文件 -->
<lib dir="${build}/WEB-INF/lib">
<!-- 包含所有的文件 -->
<include name="**" />
</lib>
<fileset dir="${build}" />
</war>
</target>
</project>
2.2执行编译打包
2.3打包结果
同时在根目录下也生成了AntTest.war
总结
第一次使用Ant,之前一直用的都是Maven,按照目前肤浅的理解,总结如下:
- Ant 可以进行编译、打包操作。核心是它的配置文件build.xml(把这个文件弄明白,ant的使用基本就没问题了)
- 在核心配置文件build.xml中,Ant为我们提供了很多工具,通过这些工具,完成我们的编译逻辑。比如:
文件目录操作:创建删除
文件操作:遍历、复制、打包
Java编译操作(所以Ant的使用是要依赖JDK环境的):编译 - Ant中的target类似于Maven的goal,都是执行一项任务。只不过Maven把goal已经定义好了(也可以自己扩展),包括编译、测试、打包、发布等。不同的target之间通过depends来进行编排。