Ant学习笔记
1 Ant简介
1.1 介绍
Ant 是一个 Apache 基金会下的跨平台的基于 Java 语言开发的构建工具。
Ant是一个将软件编译、测试、部署等步骤联系在一起的自动化工具,Ant的主要用途是构建Java应用程序。
在我们详细了解 Apache Ant 之前, 让我们来讲解为什么构建工具是需要最先了解的。
1.2 构建工具的需求
一般情况,开发人员花费大量的时间做一般性的任务,比如:构建和部署,通常包含下面的工作:
- 编译代码
- 封装二进制文件
- 在测试服务器上部署二进制文件
- 测试改变
- 从一个地点拷贝代码到另一个地点
为了自动和简化上面的工作,Apache Ant 是非常有用的。
这是一个基于开放的操作系统构建和部署的工具,该工具需要从命令行执行。
1.3 Ant的历史
- Ant 是由 James Duncan Davidson 开发的(也就是 Tomcat 最初的开发者)。
- 最初是用来构建 Tomcat,被作为一个 Tomcat 的发行版的一部分。
- Apache Make 工具包的复杂性与诸多问题催生了 Apache Ant。
- 在 2000 年的时候,Ant 被作为一个独立的项目。最新的 Apache Ant 版本是 2014 年 5 月的 1.9.4 版本。
1.4 Ant的特点
- Ant 是最完整的基于 Java 语言开发的构建和部署工具。
- Ant 具有平台无关性,可以处理平台特有的属性,诸如文件分隔符。
- Ant 还可以用来执行平台特有的任务,比如使用 touch 命令修改一个文件的修改时间。
- Ant 脚本是用 XML 来完成的。如果你已经对 XML 有所了解,那么你学习 Ant,将会比较得心应手。
- Ant 擅长自动完成重复任务。
- Ant 开始需要一系列的预先定义好的任务。
- Ant 提供了开发自定义任务的接口。
- Ant 可以很容易从命令行调用,并且它能够很好地集成免费和商用的集成开发环境。
2 Ant环境搭建
2.1 Ant下载
官网地址:http://ant.apache.org/
选择apache-ant-1.9.6版本下载:
2.2 Ant安装
将下载的apache-ant-1.9.6.zip解压到本地即可
2.3 Ant配置
2.3.1 配置ANT_HOME
ANT_HOME:D:\01program_soft\01install_before\Ant\apache-ant-1.9.6
2.3.2 配置Path
Path: %ANT_HOME%\bin
2.3.3 验证Ant安装是否成功
Dos窗口输入命令:ant -version
出现上图界面,则说明Maven安装成功。
2.3.4 IDEA中配置Ant
idea开发工具,最右边,Ant Build 中添加项目的build.xml 文件,idea会根据xml文件中的target生成插件列表
如果右边栏找不到Ant工具按钮,可以在build.xml文件上右键,找到 Add as Ant Build File,这样Ant按钮就会出来了。
2.4 Java项目引入Ant
1.写一个简单的HelloWorld
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world1");
}
}
2.要运行Ant需要有一个build.xml,名字可以换成别的,但建议就用build
可以直接到工程文件下新建一个build.xml,刚开始这个xml文件旁边没有小蚂蚁图标,需要按照如图操作,点击intellij IDE右边菜单有个Ant Build小蚂蚁图标,点击后,再点击+,将我们新建的build.xml添加到Ant Build,之后,build.xml旁边就会出现小蚂蚁图标
3.编写build.xml的内容
<?xml version="1.0" encoding="UTF-8" ?>
<!--build.xml中的第一句话,没有实际的意义-->
<!--Ant的所有内容必须包含在<project></project>里面,name是你给它取的名字,basedir指工作的根目录,.代表当前目录,default代表默认要做的事情。-->
<project name="HelloWorld" default="run" basedir=".">
<!--<property />设置变量-->
<property name="src" value="src"/>
<property name="dest" value="classes"/>
<property name="hello_jar" value="hello1.jar"/>
<!--每个target代表你想做的操作,给这个操作命名,及name值,depends是它所依赖的target在执行这个target,例如这里的compile之前ant会先检查init是否曾经被执行过,如果执行
过则直接直接执行compile,如果没有则会先执行它依赖的target例如这里的init,然后在执行这个target-->
<!--新建文件夹-->
<target name="init">
<mkdir dir="${dest}"/>
</target>
<!--开始编辑-->
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}"/>
</target>
<!--创建jar包-->
<target name="build" depends="compile">
<jar jarfile="${hello_jar}" basedir="${dest}"/>
</target>
<!--开始运行-->
<target name="run" depends="build">
<java classname="HelloWorld" classpath="${hello_jar}"/>
</target>
<!--删除生成的文件-->
<target name="clean" depends="run">
<delete dir="${dest}"/>
<delete file="${hello_jar}"/>
</target>
<target name="rerun" depends="clean,run">
<ant target="clean" />
<ant target="run" />
</target>
</project>
4.在intellij IDE里面按如下操作,可以运行build.xml,可以看到生成的jar包。
不使用编译器,打开命令,跳转到工程路径下,直接输入命令ant,即可运行程序,可以看个任务一个一个的在执行。
好了,这样一个简单的ant任务完成了。
3 Ant标签
1.Apache Ant是一个基于Java的生成工具
2.构建——打包工具 打包成 .jar包,.war包
3.生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式。
4.ant定义生成文件之间的依赖关系,它使用跨平台的Java类,使用Ant,你能够编写单个生成文件,
这个生成文件在任何Java平台都有一致地操作(因为Ant本身也是使用Java语言来实现的),这就是Ant最大的优势。
build.xml 生成文件 ant核心文件
project 只有一个
target 目标 可以有多个target
mkdir 创建目录
delete 删除目录
depends:依赖别的target
每个生成文件由单个project元素组成,一个目标target是生成过程中已定义的一个步骤,它执行任意数量的操作,
比如编译一组源文件。并且这些操作本身是有其他专用任务标签执行的。
顶级project元素需要包含一个default属性,如果在ant被调用时没有指定目标,这个属性将指定要执行的目标,
然后需要使用target元素来定义该目标本身。
build.xml文件常用属性或语法:
3.1 description
description:描述信息 注释
Ant中的属性类似于编程语言中的变量,它们都具有名称和值。然而与通常的变量不同,一经设置,ant中的属性就不可更改;它们是不可变的,就像Java语言中的String对象。这期初看起来似乎很有限制性,但这样是为了Ant的简单原则:毕竟,它是一个生成工具,而不是编程语言。如果尝试给某个现有属性赋予一个新的值,这不会被看作是一个错误,但是该属性仍然会保留其现有值。
3.2 定义与使用属性
定义:
<property name="metal" value="beryllium">
使用:${metal}
<mkdir dir="${hello}"></mkdir>
代码之间是没有先后顺序的,是靠depends来决定先后的。
3.3 location属性
<property name="database-file" location="archive/databases/${metail}.db" />
3.4 depends 定义依赖关系
先编译,再打包
<target name="init" />
<target name="preprocess" depends="init" />
<target name="compile" depends="init,preprocess" /> 编译
<target name="package" depends="compile" /> 打包
3.5 替换文件中的标记
<target name="replace">
<replace file="input.txt" token="how" value="what"></replace>
</target>
3.6 编译源代码
<javac srcdir="src">
3.7 生成对应的.class文件
<target name="myCompile">
<javac srcdir="src" destdir="${compile}"></javac>
</target>
3.8 创建jar文件
在编译Java源文件之后,结果类文件通常被打包到一个jar文件中,这个文件类似zip归档文件。
每个jar文件都包含一个清单文件,它可以指定该jar文件的属性。
<jar destfile="package.jar basedir="classes" />
basedir:要生成jar的文件目录
destfile:创建一个名为package.jar的jar文件
3.9 tstamp:时间戳
<tstamp></tstamp>
<jar destfile="${dist}/package_${DSTAMP}.jar" basedir="${compile}">
3.10 删除单个文件
<target name="deleteFile">
<delete file="${dist}/package_20210620.jar"></delete>
</target>
3.11 复制文件
<target name="copyDir">
<copy file="D:\AntProject\src\com\tangguanlin\AntTest2.java" todir="c:/"></copy>
</target>
3.12 模式匹配
。可以对目录执行模式匹配
例如:模式src*/*.java将匹配带src前缀的任何目录中的所有Java文件;
。还有另一种模式结构:**,它匹配任意数量的目录。
例如:模式**/*.java将匹配 当前目录结构下的所有Java文件
。fileset默认情况下包含指定src目录下的所有文件,因此为了仅选择Java文件,我们对模式使用了一个include元素,类似的,
我们可以对另一个模式添加一个exclude元素,从而潜在地排除include指定的匹配项。甚至可以指定多个include和exclude元素;
这样将得到一组文件和目录,它们包含include模式的所有匹配项的并集,但排除了exclude模式的所有匹配项。
<target name="copy2">
<copy todir="${dist}">
<fileset dir="src" >
<include name="**/*.java"></include>
<exclude name="**/AntTest2.java"></exclude>
</fileset>
</copy>
</target>
3.13 移动文件
<target name="moveFile">
<move file="D:\AntProject\src\com\tangguanlin\AntTest.java" tofile="c:/TestCopy.java"></move>
</target>
3.14 移动文件夹
<target name="moveDir">
<move file="D:\AntProject\src\com\tangguanlin\AntTest.java" todir="c:/"></move>
</target>
3.15 echo:打印消息
<echo message="开始打包。。。" />
3.16 创建zip文件
<target name="compress" depends="myCompile">
<zip destfile="${dist}/package.zip" basedir="${compile}"></zip>
</target>
3.17 解压缩
<target name="uncompress" depends="compress">
<unzip dest="${dist}" src="${dist}/package.zip"></unzip>
</target>
3.18 编译class
编译class,需要用到的类路径:
(1)设置classpath的方法:
<path id="project.lib">
<fileset dir="${basedir}/lib">
<include name="**/*.jar"/>
</fileset>
</path>
(2)classpath的使用,样例如下:
<target name="build">
<javac srcdir="${basedir}/src/main/java" destdir="${basedir}/src/main/webapp/WEB-INF/classes">
<classpath refid="project.lib"></classpath>
</javac>
</target>
3.19 打war包
<target name="warFile" depends="build">
<!-- 建立新war包。 -->
<war destfile="${basedir}/${warFileName}"
webxml="${basedir}/src/main/webapp/WEB-INF/web.xml">
<!-- 将非jar和非class文件拷贝到war包的对应路径下。 -->
<fileset dir="${basedir}/src/main/webapp">
<include name="**/**.*" />
<exclude name="**/*.jar"/>
<exclude name="**/*.class"/>
</fileset>
<!-- 将jar和class文件拷贝到war包的对应路径下。 -->
<lib dir="${basedir}/src/main/webapp/WEB-INF/lib" />
<classes dir="${basedir}/src/main/webapp/WEB-INF/classes" />
</war>
</target>
4 build.xml核心文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--指定根目录,当前目录 默认任务为dist任务 basedir为当前工程目录 -->
<project name="myAntProject" default="dist" basedir=".">
<!-- 定义属性,常量-->
<property name="hello" value="test123"></property>
<property name="world" value="world123"></property>
<property name="compile" value="compile"></property>
<property name="dist" value="dist"></property>
<!--定义初始化任务-->
<target name="init">
<!--输出控制台消息-->
<echo message="工程开始构 目录为:${basedir}"></echo>
</target>
<!--处理前任务 依赖init任务-->
<target name="preprocess" depends="init">
<!--创建名为test123的文件夹 -->
<mkdir dir="${hello}"></mkdir>
<mkdir dir="${world}"></mkdir>
<mkdir dir="${compile}"></mkdir>
<mkdir dir="${dist}"></mkdir>
<!--删除名为test123的文件夹-->
<delete dir="${hello}"></delete>
</target>
<!--删除文件-->
<target name="deleteFile">
<delete file="${dist}/package_20210620.jar"></delete>
</target>
<!--复制文件 可以改名字-->
<target name="copyFile">
<copy file="D:\AntProject\src\com\tangguanlin\AntTest.java" tofile="c:/Test2Copy.java"></copy>
</target>
<!--复制文件到文件夹-->
<target name="copyDir">
<copy file="D:\AntProject\src\com\tangguanlin\AntTest2.java"
todir="c:/"></copy>
</target>
<!--模式匹配下的复制-->
<target name="copy2">
<copy todir="${dist}">
<fileset dir="src" >
<!--src目录下的所有java文件-->
<include name="**/*.java"></include>
<!--排除AntTest2.java这个文件-->
<exclude name="**/AntTest2.java"></exclude>
</fileset>
</copy>
</target>
<!--移动文件 可以改名字-->
<target name="moveFile">
<move file="D:\AntProject\src\com\tangguanlin\AntTest.java" tofile="c:/TestCopy.java"></move>
</target>
<!--移动文件到文件夹-->
<target name="moveDir">
<move file="D:\AntProject\src\com\tangguanlin\AntTest.java" todir="c:/"></move>
</target>
<!--文件内容字符替换-->
<target name="replace">
<replace file="input.txt" token="how" value="what" ></replace>
</target>
<!--定义编译依赖的jar文件-->
<path id="project.lib">
<fileset dir="${basedir}/lib">
<include name="**/*.jar"/>
</fileset>
</path>
<!--编译成class,将src的所有文件编译到compile目录下-->
<target name="myCompile" depends="preprocess">
<javac srcdir="src" destdir="${compile}">
<!--引入类路径-->
<classpath refid="project.lib"></classpath>
</javac>
</target>
<!--打jar包 将编译后的class文件打成jar包-->
<target name="dist" depends="myCompile">
<!--定义时间戳-->
<tstamp></tstamp>
<!--打jar包,将compile的文件,打到dist目录下,package_20210622.jar-->
<jar destfile="${dist}/package_${DSTAMP}.jar" basedir="${compile}">
<manifest>
<attribute name="Built-By" value="admin"></attribute>
<!--jar包的主类-->
<attribute name="Main-Class"
value="com.tangguanlin.AntTest2"></attribute>
</manifest>
</jar>
</target>
<!--打成zip包-->
<target name="compress" depends="myCompile">
<zip destfile="${dist}/package.zip" basedir="${compile}"></zip>
</target>
<!--解压缩zip包-->
<target name="uncompress" depends="compress">
<unzip dest="${dist}" src="${dist}/package.zip"></unzip>
</target>
<!--打成war包-->
<target name="warFile" depends="myCompile">
<!-- 建立新war包。 -->
<war destfile="${basedir}/package.war"
webxml="${basedir}/src/main/webapp/WEB-INF/web.xml">
<!-- 将非jar和非class文件拷贝到war包的对应路径下。 -->
<fileset dir="${basedir}/src/main/webapp">
<include name="**/**.*" />
<exclude name="**/*.jar"/>
<exclude name="**/*.class"/>
</fileset>
<!-- 将jar和class文件拷贝到war包的对应路径下。 -->
<lib dir="${basedir}/src/main/webapp/WEB-INF/lib" />
<classes dir="${basedir}/src/main/webapp/WEB-INF/classes" />
</war>
</target>
</project>
5 build.xml样例1
(真实项目的ant build.xml文件)
6 build.xml样例2
(网上找的 build.xml文件)
6.1 build.xml
在项目根目录下创建一个build.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<project name="AntTestDemo" default="run" basedir=".">
<property name="src" value="src"/>
<property name="dest" value="classes"/>
<property name="helloant_jar" value="helloant.jar"/>
<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="${helloant_jar}" basedir="${dest}"/>
</target>
<target name="run" depends="build">
<java classname="com.zdz.ant.test.HelloAnt" classpath="${helloant_jar}"/>
</target>
<target name="clean">
<delete dir="${dest}" />
<delete file="${helloant_jar}" />
</target>
<target name="rerun" depends="clean,run">
<ant target="clean" />
<ant target="run" />
</target>
</project>
为直观起见直接截图上来了
6.2 运行ant
右键点击build.xml 运行ant,如下图所示:
6.3 运行结果
Buildfile: D:\workspace\AntTestDemo\build.xml
init:
[mkdir] Created dir: D:\workspace\AntTestDemo\classes
compile:
[javac] Compiling 1 source file to D:\workspace\AntTestDemo\classes
build:
[jar] Building jar: D:\workspace\AntTestDemo\helloant.jar
run:
[java] Hello ant,by zdz!
BUILD SUCCESSFUL
Total time: 2 seconds
出来BUILD SUCCESSFUL 和预期结果说明ant跑成功了。
rerun" depends=“clean,run”>
为直观起见直接截图上来了
[外链图片转存中...(img-hLPo3PxG-1640245461697)]
## 6.2 运行ant
右键点击build.xml 运行ant,如下图所示:
[外链图片转存中...(img-GeIg738R-1640245461698)]
## 6.3 运行结果
```properties
Buildfile: D:\workspace\AntTestDemo\build.xml
init:
[mkdir] Created dir: D:\workspace\AntTestDemo\classes
compile:
[javac] Compiling 1 source file to D:\workspace\AntTestDemo\classes
build:
[jar] Building jar: D:\workspace\AntTestDemo\helloant.jar
run:
[java] Hello ant,by zdz!
BUILD SUCCESSFUL
Total time: 2 seconds
出来BUILD SUCCESSFUL 和预期结果说明ant跑成功了。