写在前面
- Ant目前已经基本很少有人用了,基本都是Maven,甚至Gradle
- 什么时候使用Ant,或者说是Maven、Gradle之类的构建够工具?
【1】服务器部署的时候
【2】Linux系统或者UNIX系统 - 本文参考 https://blog.csdn.net/tarena_zy520/article/details/84700868
一、概念理解
- Ant是构建工具的一种,它的前身是make,但是make多用于c/c++,Ant则是针对Java程序构建。
- 优缺点:
【1】优点:跨平台 --因为ant是使用java编写的,所以它跨平台。
【2】缺点:技术已经比较落后,构建需要写的东西比较多,不及Maven或者Gradle。 - 配置文件build.xml,类似于Maven中的pom.xml
- target 任务,Ant构建项目的方式是通过执行一个个的target任务实现的。
二、Ant环境搭建
- 因为是Java写的,所以要先安装JDK,配置
JAVA_HOME
,PATH
,CLASS_PATH
等环境变量。 - 下载Ant,地址http://ant.apache.org/
根据说明可以看出1.9x版本的需要jdk1.7,1.10.x版本的需要jdk1.8,根据自身需要进行下载。
TIPS: 后面的PGP/SHA1/SHA512是表示以该加密方式下载,下载后会验证文件是否被修改过(植入木马之类)。 - 解压到自定义目录,设置Ant环境变量
ANT_HOME
和PATH
。 - cmd验证是否配置正确。
三、使用Ant构建HelloWorld
- 创建src文件夹,在其中创建HelloWorld.java文件,写入一下内容:
package test.ant;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello world1");
}
};
- 要运行ant需要有一个默认的配置文件:build.xml,类似于Maven的pom.xml。如果不是默认名称的xml,执行时需指明文件名称,如:
Ant –buildfile test.xml
在src下创建一个build.xml文件,写入以下内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!--name指定项目名称,default指定默认的运行任务,basedir指定工作的根目录-->
<project name="HelloWorld" default="run" basedir=".">
<!--配置在该文档中会用到的属性key、value-->
<!--也可以直接引入外部的.property文件,如下:-->
<!--<property file="all.properties" />-->
<property name="src" value="src"/>
<property name="dest" value="classes"/>
<property name="hello_jar" value="hello1.jar"/>
<!--真正需要执行的任务,用target标签指明-->
<!--每个target都有一个唯一的name值-->
<target name="init">
<!--具体要做的事情,创建目录-->
<mkdir dir="${dest}"/>
</target>
<!--target标签中的depends指明该任务需要依赖的其他任务,compile任务执行之前需要先执行init任务-->
<target name="compile" depends="init">
<!--srcdir指明源码的位置,destdir指明编译后的存放路径-->
<javac srcdir="${src}" destdir="${dest}"/>
</target>
<!--打成jar包,jarfile指明打包的文件名,basedir指明被归档的文件名-->
<target name="build" depends="compile">
<jar jarfile="${hello_jar}" basedir="${dest}"/>
</target>
<!--运行jar包-->
<target name="run" depends="build">
<java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
</target>
<!--删除生成的文件,dir表示删除的目录,file表示删除的文件-->
<target name="clean">
<delete dir="${dest}" />
<delete file="${hello_jar}" />
</target>
<!---多个依赖中间使用“,”隔开-->
<!--在一个target中可以调用其他的target,只需要写明ant标签和该标签的target属性,即目标target的name属性值-->
<target name="rerun" depends="clean,run">
<ant target="clean" />
<ant target="run" />
</target>
</project>
- cd至build.xml所在的目录,在命令行窗口执行命令:
ant
,此处的ant
等同于ant run
(因为在我的build.xml中配置的默认执行是run)
结果如下:
生成的文档结构:
- Ant支持阶段性的命令,比如你并不想运行程序,只想执行编译打包。键入
ant build
即可。
Ant中的每一个任务都可以这样调用ant + target name
四、整合Ant
(一). 直接整合build.xml
- 情景:一个项目分成很多个模块,每个模块有一个build.xml,我们需要整合这些build.xml。
- 做法:尽可能的使用原先build.xml中的内容。
- 例子:有三个小组,他们分别有一个src 和一个写好的build.xml。这个时候你拿到他们的src,建立三个文件夹src1 ,src2, src3分别把他们的src和build.xml放进去,然后写一个build.xml
<?xml version="1.0" encoding="UTF-8" ?>
<project name="main" default="build" basedir=".">
<property name="bin" value="${basedir}\bin" />
<property name="src1" value="${basedir}\src1" />
<property name="src2" value="${basedir}\src2" />
<property name="src3" value="${basedir}\src3" />
<target name="init">
<mkdir dir="${bin}" />
</target>
<target name="run">
<!--在一个target中可以调用其他xml中的target,只需要写明dir和target属性-->
<ant dir="${src1}" target="run" />
<ant dir="${src2}" target="run" />
<ant dir="${src3}" target="run" />
</target>
<target name="clean">
<ant dir="${src1}" target="clean" />
<ant dir="${src2}" target="clean" />
<ant dir="${src3}" target="clean" />
</target>
<target name="build" depends="init,call">
<!--一个copy可以包含多个fileset-->
<copy todir="${bin}">
<fileset dir="${src1}">
<include name="*.jar" />
</fileset>
<fileset dir="${src2}">
<include name="*.jar" />
</fileset>
<fileset dir="${src3}">
<include name="*.jar" />
</fileset>
</copy>
</target>
<target name="rebuild" depends="build,clean">
<ant target="clean" />
<ant target="build" />
</target>
</project>
(二). 通过引入property
和xml include
可以使xml更加简洁。
1. propery 属性文件的使用
-
情景:一些共同、类似的property使build.xml变的很臃肿,
-
做法:可以直接引用外部properties文件。
【1】. 新建all.properties,内容如下src1=D:\\study\\ant\\src1 src2=D:\\study\\ant\\src2 src3=D:\\study\\ant\\src3
【2】. 然后你的build.xml文件可以这样写,别人只需要更改配置文件,而不许要更改你的build.xml文件了
<?xml version="1.0" encoding="UTF-8" ?> <project name="main" default="build" basedir="."> <property file="all.properties" /> <property name="bin" value="${basedir}\bin" /> <target name="init"> <mkdir dir="${bin}" /> </target> <target name="run"> <ant dir="${src1}" target="run" /> <ant dir="${src2}" target="run" /> <ant dir="${src3}" target="run" /> </target> <target name="clean"> <ant dir="${src1}" target="clean" /> <ant dir="${src2}" target="clean" /> <ant dir="${src3}" target="clean" /> </target> <target name="build" depends="init,call"> <copy todir="${bin}"> <fileset dir="${src1}"> <include name="*.jar" /> </fileset> <fileset dir="${src2}"> <include name="*.jar" /> </fileset> <fileset dir="${src3}"> <include name="*.jar" /> </fileset> </copy> </target> <target name="rebuild" depends="build,clean"> <ant target="clean" /> <ant target="build" /> </target> </project>
2. xml include 的使用
-
情景:你想给每个小组的build.xml加入几个共同的target,
-
做法:你可以写一个include.xml文件,在每个build.xml中引用该include.xml
-
优点:不单可以提取出属性来,连target也可以。
【1】include.xml 内容如下
<?xml version="1.0" encoding="UTF-8" ?> <property name="src" value="src"/> <property name="dest" value="classes"/> <target name="test" > <ant target="run" /> </target>
【2】更改三个build.xml文件,每个里边加入如下内容
<!--include a xml file ,it can be common propery ,can be also a target --> <!DOCTYPE project [<!ENTITY share-variable SYSTEM "file:../include.xml">]> &share-variable;
【3】此时,只需在include.xml添加propery或target,build.xml会同时添加这些propery和target。内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!--include a xml file ,it can be common propery ,can be also a target --> <!DOCTYPE project [ <!ENTITY share-variable SYSTEM "file:../include.xml"> ]> <project name="HelloWorld" default="run" basedir="."> <!--use the include --> &share-variable; <!--defined the property--> <!--via include <property name="src" value="src"/> <property name="dest" value="classes"/> --> <property name="hello_jar" value="hello1.jar"/> <!--define the op--> <target name="init"> <mkdir dir="${dest}"/> </target> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}"/> </target> <target name="build" depends="compile"> <jar jarfile="${hello_jar}" basedir="${dest}"/> </target> <target name="run" depends="build"> <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/> </target> <target name="clean"> <delete dir="${dest}" /> <delete file="${hello_jar}" /> </target> <target name="rerun" depends="clean,run"> <ant target="clean" /> <ant target="run" /> </target> </project>
五、Eclipse中使用Ant
(一)导入Ant项目至Eclipse 的坑
- 由于我先了解的maven,maven有一个命令
mvn eclipse:eclipse
可以吧maven项目转成eclipse也认识的项目。但是Ant我还没找到这样的插件。但是Eclipse自带Ant插件,可以根据ant项目的build.xml自动导入项目。 - eclipse中,New->Project->Java Project From Existing Ant Buildfile,选择我在第三章节创建的HelloWorld中的build.xml
得到的项目结构如下:
- 选择build.xml右键run as Ant build
出现以下错误:
- 检查build.xml,发现之前使用Ant命令之所以能够成功,是因为我手动创建的src文件夹。因此在init任务中添加以下内容:
- 感觉这下应该OK了,运行Ant build,结果还是报错:
- 找不到类。打开jar,发现空空如也,什么也没有编译进来:
- 比较郁闷,我的test/ant下明明有HelloWorld.java怎么什么也没有编译呢?想了半天想不明白,无意中看到HelloWorld.java的属性:
- 竟然发现,是引用的我一开始用Ant构建项目时的路径,莫非我的workspace下根本没有HelloWorld.java?赶紧打开看看:
对比发现竟然不是同一个目录,src下什么也没有!难怪什么也没有编译进来。原因我在想是不是Ant构建时的路径有问题,但是并未排查。希望大神指点。 - 最后妥协,在src目录下创建test/ant/HelloWorld.java。再次Ant build。如下:
运行成功:
- 但是后期的实验中发现使用Ant构建的项目,导入Eclipse后,windows文件系统中的内容无法与Eclipse中同步,还没有研究出来。。望大神指点。