对于新入职的新人来说,学校的那一套东西于实际的工作根本不够。诸多的技术知识还得自己去慢慢掌握和理解。对于项目的发布笔者以前也就仅仅使用开发工具集成的发布功能,并未使用过Ant进行项目的发布。因此需要做一些学习。
Ant技术简介
Ant是开源组织Apache的一个项目,是一个基于Java语言的生成工具。当一个项目过于庞大是每次编译、打包都会变得比较复杂,Ant就像一个流程脚本引擎,用于自动化的完成项目的编译、打包等。Ant的脚本是基于XML的。
Ant环境搭建
笔者使用的是Windows开发环境,这里就只介绍windows下的环境搭建吧。
第一步安装JDK,并配置好环境。这部分不用多说,我也不想将机子里的JDK卸载重新配置一次。如何配置请Google、百度。
第二步安装Ant:
1、下载Ant压缩包文件:http://ant.apache.org/bindownload.cgi
2、将下载下来的压缩包文件解压到某个目录下:D:\apache-ant-1.9.2-bin\apache-ant-1.9.2
3、配置环境变量:
ANT_HOME:D:\apache-ant-1.9.2-bin\apache-ant-1.9.2
path:%ANT_HOME%\bin;
4、验证:使用WIN+R快捷方式进入cmd,输入命令ant -version如果出现版本信息则Ant配置成功。
Ant核心概念
XML:构建文件是以XML文件来描述的。
陈述式语法:构建文件的语法易于理解。
每个构建文件包含一个工程(project)。
每个工程包含若干个目标(target)。
目标可以依赖于其他目标(depends)。
目标包含有任务(task)。
可以使用java语言扩展定义新的任务。
Ant的关键元素
1、project元素
project元素是ant构建文件的根元素,每个构建文件必须至少有一个project元素。在project元素下可以有多个target元素。 下面看看project元素具有的一些属性:
name:用户指定project元素的名称.
default:用于指定project默认执行的target名称.
basedir:用于指定基路径的位置.
以一个再简单不过的实例看看:
1 <?xml version="1.0" ?>
2 <project name ="antPro" default ="getBaseDir" basedir ="E:/TestAnt">
3 <target name="getBaseDir">
4 <echo message="The base dir is: ${basedir}"/>
5 </target>
6 </project>
WIN+R进入cmd键入ant命令输出如下信息:
2、target元素
target元素为ant的基本执行目标单元,它可以包含多个task(任务),多个target之间可以存在相互的依赖关系(depends),其 具有的属性如下:
name:用于指定target的名称,该名称唯一,project使用该名称来指定default属性。
depends:说明此target依赖于某个target,如果依赖多个target使用","分隔。ant会根据depends中的target的先后顺 序一次的执行target。Tips:被依赖的target应该先执行。
if:用于验证指定的属性是否存在,不存在即不执行该target。
unless:功能与if属性正好相反。
decription:用于描述target属性。
同样的以一个实际例子来看:
1 <?xml version="1.0" ?>
2 <project name="targetPro" default="targetB">
3 <!-- 指定执行targetB,查看targetB可以知道targetB 可以被执行,不过由于其依赖于targetA,而且tagetA可以被执行
4 因此targetA先执行,之后执行targetB,而且basedir不指定的 情况下,默认为build.xml文件所在的目录 -->
5 <target name="targetA" if="ant.java.version">
6 <echo message="Java Version: ${ant.java.version}" />
7 </target>
8 <target name="targetB" depends="targetA" unless="philander">
9 <description>
10 a depend example!
11 </description>
12 <echo message="The base dir is: ${basedir}" />
13 </target>
14 </project>
使用ant命令执行构建文件,输入信息如下:
3、property元素
property元素用于参数和参量的设定,例如project元素的属性就可以通过property元素来指定。property还可以引入外部文件进行设 定。以properties文件为例,引入格式为:
<preperty file="build.proerties"/>
property元素还可作为task的属性值,在tash中通过将属性名放在"${}"中实现。
Ant提供了一些内置的属性,就像上述的${ant.java.version},具体还有:
内置属性:
basedir:project 基目录的绝对路径;
ant.file:buildfile的绝对路径;
ant.version:Ant 的版本信息 ;
ant.project.name:当前指定的project的名字,即前文说到的project的name属性值;
ant.java.version:Ant 检测到的JDK版本 。
同样的以一个实例来看看property元素如何使用:
build.properties文件中代码为存放了user:LCore,password:test
1 <?xml version="1.0" ?>
2 <project name ="propertyPro" default ="example">
3 <property name ="name" value ="philander"/>
4 <property name ="age" value ="25"/>
5 <property file="build.properties" />
6 <target name ="example">
7 <echo message ="name: ${name}, age: ${age}, user:${user},password:${password}"/>
8 </target>
9 </project>
构建的结果如下:
Ant常用命令标签
1、Copy标签
该命令主要用来对文件和目录进行复制。
1 <!--复制单个的文件-->
2 <copy file="original.txt" tofile="copied.txt"/>
3 <!--对文件目录进行复制-->
4 <copy todir="../dest_dir">
5 <fileset dir="src_dir"/>
6 </copy>
7 <!--将文件复制到另外的目录-->
8 <copy file="source.txt" todir="../home/philander"/>
2、delete标签
该命令用于删除文件或目录
1 <!--删除某个文件-->
2 <delete file="/home/photos/philander.jpg"/>
3 <!--删除某个目录-->
4 <delete dir="/home/photos"/>
5 <!--删除所有的备份目录或空目录-->
6 <delete includeEmptyDirs="true">
7 <fileset dir="." includes="**/*.bak"/>
8 </delete>
3、mikdir标签
该命令标签用于创建目录<mkdir dir="/home/philander/build/classes"/>
4、move标签
该命令标签用于移动文件或目录
1 <!--移动单个文件可以不加文件后缀名->
2 <move file="sourcefile" tofile=”destfile”/>
3 <!--移动单个文件到另一目录-->
4 <move file="sourcefile" todir=”movedir”/>
5 <!--移动某个目录到另一目录-->
6 <move todir="newdir"> <fileset dir="olddir"/></move>
5、echo标签
该命令标签的作用是根据日志或监控其的级别输出信息。他包括message、file、append和level四个属性
<echo message="Hello,ANT" file="/home/philander/logs/ant.log" append="true">
6、Jar标签
该标签用来生成一个jar文件。
(1) destfile表示JAR文件名。
(2) basedir表示被归档的文件名。
(3) includes表示别归档的文件模式。
(4) exchudes表示被排除的文件模式。
7、javac标签
该标签用户编译一个或一组java文件。
(1).srcdir表示源程序的目录。
(2).destdir表示class文件的输出目录。
(3).include表示被编译的文件的模式。
(4).excludes表示被排除的文件的模式。
(5).classpath表示所使用的类路径。
(6).debug表示包含的调试信息。
(7).optimize表示是否使用优化。
(8).verbose 表示提供详细的输出信息。
(9).fileonerror表示当碰到错误就自动停止。
8、java标签
该标签用于执行编译的.class文件。
(1).classname 表示将执行的类名。
(2).jar表示包含该类的JAR文件名。
(3).classpath所表示用到的类路径。
(4).fork表示在一个新的虚拟机中运行该类。
(5).failonerror表示当出现错误时自动停止。
(6).output 表示输出文件。
(7).append表示追加或者覆盖默认文件。
9、javadoc :该标签用于生成doc文档
Ant构建部署Java项目
1、通过java标签编译项目。这里我们新建一个基本的java project进行测试。工程的目录结构如下:
ant构建文件内容如下:
<?xml version="1.0" ?>
2 <project name ="TestAnt" default="compile" basedir=".">
3 <target name="clean">
4 <delete dir="${basedir}/build"/>
5 </target>
6 <target name="compile" depends ="clean">
7 <mkdir dir ="${basedir}/build/classes"/>
8 <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
9 </target>
10 </project>
这里我们可以直接在Eclipse中运行build.xml文件,控制台输出结果如下:
1
Buildfile: D:\work\ceis\TestAnt\build.xml
2 clean:
3 [delete] Deleting directory D:\work\ceis\TestAnt\build
4 compile:
5 [mkdir] Created dir: D:\work\ceis\TestAnt\build\classes
6 [javac] D:\work\ceis\TestAnt\build.xml:8: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
7 [javac] Compiling 1 source file to D:\work\ceis\TestAnt\build\classes
8 BUILD SUCCESSFUL
9 Total time: 874 milliseconds
2、通过java命令执行java程序。
修改下上述的build.xml文件如下:
<?xml version="1.0" ?>
2 <project name ="TestAnt" default="run" basedir=".">
3 <target name="clean">
4 <delete dir="${basedir}/build"/>
5 </target>
6 <target name="compile" depends ="clean">
7 <mkdir dir ="${basedir}/build/classes"/>
8 <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes" encoding="UTF-8"/>
9 </target>
10 <target name="run" depends ="compile">
11 <!--类名-->
12 <java classname ="com.lcore.Test">
13 <classpath>
14 <pathelement path="${basedir}/build/classes"/>
15 </classpath>
16 </java>
17 </target>
18 <target name="jar" depends="run">
19 <jar destfile="helloworld.jar" basedir="${basedir}/build/classes">
20 <manifest>
21 <attribute name="Main-class" value="HelloWorld"/>
22 </manifest>
23 </jar>
24 </target >
25
26 </project>
输入结果:
run:
[java] hello ant
3、使用jar命令生成jar文件
修改上述配置文件,添加一个生成jar的target
<?xml version="1.0" ?>
2 <project name ="TestAnt" default="jar" basedir=".">
3 <target name="clean">
4 <delete dir="${basedir}/build"/>
5 </target>
6 <target name="compile" depends ="clean">
7 <mkdir dir ="${basedir}/build/classes"/>
8 <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
9 </target>
10 <target name="run" depends ="compile">
11 <!--类名-->
12 <java classname ="com.lcore.Test">
13 <classpath>
14 <pathelement path="${basedir}/build/classes"/>
15 </classpath>
16 </java>
17 </target>
18 <target name="jar" depends="run">
19 <jar destfile="helloworld.jar" basedir="${basedir}/build/classes">
20 <manifest>
21 <attribute name="Main-class" value="HelloWorld"/>
22 </manifest>
23 </jar>
24 </target >
25 </project>
之后将会在工程目录下生成jar文件
4、使用javadoc命令生成DOC文档
修改上述配置文件:
<?xml version="1.0" ?>
2 <project name ="TestAnt" default="javadocs" basedir=".">
3 <target name="clean">
4 <delete dir="${basedir}/build"/>
5 </target>
6 <target name="compile" depends ="clean">
7 <mkdir dir ="${basedir}/build/classes"/>
8 <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
9 </target>
10 <target name="run" depends ="compile">
11 <!--类名-->
12 <java classname ="com.lcore.Test">
13 <classpath>
14 <pathelement path="${basedir}/build/classes"/>
15 </classpath>
16 </java>
17 </target>
18 <target name="jar" depends="run">
19 <jar destfile="helloworld.jar" basedir="${basedir}/build/classes">
20 <manifest>
21 <attribute name="Main-class" value="HelloWorld"/>
22 </manifest>
23 </jar>
24 </target >
25 <target name="javadocs" depends="run" description=" Create The API documentation">
26
27 <!--packagenames,指包的名称-->
28 <javadoc packagenames="com.lcore.*"
29 sourcepath="${basedir}/src"
30 destdir="api"
31 version="true"
32 use="true"
33 windowtitle="Docs API">
34 </javadoc>
35 </target>
36 </project>
查看API的时候偶然发现注释中中文出现了乱码情况,经过测试,可以使用如下方法解决:在javadoc命令中添加编码格式
<target name="javadocs" depends="run" description=" Create The API documentation"> <!--packagenames,指包的名称-->
<javadoc packagenames="com.lcore.*"
sourcepath="${basedir}/src"
destdir="api"
version="true"
use="true"
windowtitle="Docs API"
encoding="UTF-8"
docencoding="GBK">
</javadoc>
</target>
Ant构建部署J2EEweb项目
创建一个简单的web项目。
构建ant xml脚本:
<?xml version="1.0" encoding="UTF-8" ?>
2 <project name ="WebTest" default ="war" basedir =".">
3 <property name ="classes" value ="${basedir}/build/classes"/>
4 <property name ="build" value ="${basedir}/build"/>
5 <property name ="lib" value ="${basedir}/webContent/WEB-INF/lib"/>
6 <!-- 删除build 路径-->
7 <target name ="clean">
8 <delete dir ="${build}"/>
9 </target>
10
11 <!-- 建立build/classes 路径,并编译class 文件到build/classes 路径下-->
12 <target name ="compile" depends ="clean">
13 <mkdir dir ="${classes}"/>
14 <javac srcdir ="${basedir}/src" destdir ="${classes}" includeantruntime="on"/>
15 </target>
16
17 <!-- 打war 包-->
18 <target name ="war" depends ="compile">
19 <war destfile ="${basedir}/WebTest.war" webxml ="${basedir}/webContent/WEB-INF/web.xml">
20 <!-- 拷贝webContent下除了WEB-INF 和META-INF 的两个文件夹-->
21 <fileset dir ="${basedir}/webContent" includes ="**/*.jsp"/>
22 <!-- 拷贝lib 目录下的jar 包-->
23 <lib dir ="${lib}"/>
24 <!-- 拷贝build/classes 下的class 文件-->
25 <classes dir ="${classes}"/>
26 </war>
27 </target>
28 </project>
WIN+R cmd ->ant 运行之后结果:
之后我们便可以将webTest.war直接发布到Tomcat容器中去了。
Over!菜鸟的Ant学习也告一段落了。
参考资源:
http://www.cnblogs.com/philander/articles/1782254.html
http://zhouhaitao.iteye.com/blog/1142188
By LCore