camper00 2012-09-24
ant是apache的java子项目"jakarta"的子项目.你可以选择当前的版本,,window版
解压后ant_home用来方便访问。并确保你也设置了java_home。
setant_home=D:"java"kit"ant"jakarta-ant-1.5.1这是我的目录
helloant
我们要开发一个java类:其内容只有一句,输出"helloant"字符串。并使用ant完成编译和运行工作,这个例子只是为了跑通ant,不附加多余的东西。
下面是:“hello.ant.HelloAnt.java”文件。
packagehello.ant;
publicclassHelloAnt{
publicstaticvoidmain(String[]args){
System.out.println("helloant,ant的第一次接触,好棒!");
}
}
在项目根目录(hello-ant")写1个文件:ant执行配置文件build.xml
“build.xml”文件
<?xmlversion="1.0"encoding="GB2312"?>
<!--一个项目,可包含很多任务组(target)-->
<projectdefault="main"basedir=".">
<!--项目中的一个任务组,可包含很多任务(task:javac,java...)-->
<targetname="main">
<!--编译-->
<javacsrcdir="src"main"hello"ant"destdir="build"classes"/>
<!--运行-->
<javaclassname="hello.ant.HelloAnt">
<classpath>
<pathelementpath="build"classes"/>
</classpath>
</java>
</target>
</project>
ok,一切大功告成,哦,不,还没有运行它。
dos下进入hello-ant的目录,即build.xml所在的目录,我们要用ant工具执行它,
执行:%ant_home%/bin/ant-filebuild.xml用ant工具执行当前目录下的配置文件build.xml
或:ant-filebuild.xml你如果设置%ant_home%/bin到path中
这次ok了,这是答案:
命令提示符窗口
D:"temp"hello-ant>ant-filebuild.xml
Buildbuild.xml
main:
[javac]Compiling1sourcefiletoD:"temp"hello-ant"build"classes
[java]helloant,ant的第一次接触,好棒!
BUILDSUCCESSFUL
Totaltime:2seconds
D:"temp"hello-ant>
检查一下build/classes目录,哦,看到编译过的文件就在这里:
build/classes/hello/ant/HelloAnt.class.
helloant进级
我们要改进build.xml,让它做更多的事情:
定义全局变量
初始化,主要是建立目录
编译(已有)
打包为jar
建立APIdocumentation
生成distribution产品
凡事都讲究平衡,你要ant给你做更多事,当然要累一点点,不过只用累一次,以后的代码修改后的构建都是"一键式"完成,我们制作一个hello的简单例子,你可以自己做j2ee的练习。
我们要扩充目录结构,使它更像回事:
:"src,"docs,"lib是自己组织的文件结构,"build,"dist是ant动态生成的成品。
"src源文件:java源,源,jsp源,xml配置.....
"src"mainjava源
"src"window,unix,liunx的执行,我们的简单只有一个:
run.bat:javahello.ant.HelloAnt
"docs手写说明文档
"lib程序所需类库的jar,比如j2ee.jar,mail,jar...
"build用ant动态生成的构建目录
"build"classes编译的类文件
"build"docscopy""docs"的手写说明文档,和ant生成的api文档
"build"lib放置我们自己的HelloAnt.class打包成品hello-ant.jar
"dist"bincopy""src""得执行文件
"dist"docscopy""build"docs"的文档
"dist"lib除了copy""build"lib"下的hello-ant.jar外,
还应copy""lib"的程序所需jar,这里我们没有。
以上是我学老外的文件组织,大家可以按照自己的爱好组织
我们编写必要的文件:
hello.ant.HelloAnt.java
src".bat
@echooff
echo========================================================
echo请先设置Environment
echo.
echoJAVA_HOME:%JAVA_HOME%
echo======================================================
%java_home%"bin"java-classpath.."lib"hello-ant.jarhello.ant.HelloAnt
pause
"docs"index.html随便写一个手写的文档
helloant软件项目手册docs
--------------------------------------------------------------------------------
访问api文档
"build.xml配置文件
<?xmlversion="1.0"encoding="GB2312"?>
<!--
=======================================================================
hello-ant项目,学习ant工具的第2个buildfile.
参照ant的jakarta-ant-1.6alpha的build.xml
Copyright(c)2002TheNeusoftSoftwareFoundation.Allrights
reserved.
=======================================================================
-->
<!--
文档结构为:
<project>
<property/>全局变量的定义
<property/>...
<targetname="1">任务组(tasks)
<javac></javac>一项javac任务
...
<oneTask></ontTask>一项其它任务
</target>
<targetname="2">
<javac></javac>
...
<oneTask></ontTask>
</target>
</project>
project代表一个项目,
default:运行到名称为"dist"的target(任务组)
basedir:基准路径。
-->
<projectdefault="dist"basedir=".">
<!--
===================================================================
定义属性(propertytasks)
最好把用到的路径呀,名称呀都在这里定义成全局变量
例:定义
<propertyname="a"="hello"/>
以后就可以这样用它:
<propertyname="b"="${a}/b"/>
现在:b=="hello/b"
===================================================================
-->
<!--主要的系统环境属性-->
<propertyenvironment="env"/><!--取window,unix...的环境变量-->
<propertyname="java.home"="${env.JAVA_HOME}"/>
<propertyname="ant.home"="${env.ANT_HOME}"/>
<!--主要的app环境属性-->
<propertyname="app.name"="hello-ant"/>
<propertyname="app.jar"="${app.name}.jar"/>
<propertyname="app.copyright"="Copyright(c)2002TheNeusoftSoftwareFoundation.Allrightsreserved."/>
<!--app中src的属性-->
<propertyname="src.dir"="src"/>
<propertyname="src.main"="${src.dir}/main"/>
<propertyname="src."="${src.dir}/"/>
<!--app用到的lib-->
<propertyname="lib.dir"="lib"/>
<!--app的build目录中-->
<propertyname="build.dir"="build"/>
<propertyname="build.classes"="${build.dir}/classes"/>
<propertyname="build.docs"="${build.dir}/docs"/>
<propertyname="build.docs.api"="${build.docs}/api"/>
<propertyname="build.lib"="${build.dir}/lib"/>
<!--app的dist(distribution)目录中-->
<propertyname="dist.dir"="dist"/>
<propertyname="dist.bin"="${dist.dir}/bin"/>
<propertyname="dist.docs"="${dist.dir}/docs"/>
<propertyname="dist.lib"="${dist.dir}/lib"/>
<!--app的docs目录中-->
<propertyname="docs.dir"="docs"/>
<!--
定义一组路径以后可以通过id重用这组路径,例:
<javacsrcdir="src/main"destdir="build/classes">
<classpathrefid="classpath"/>
</javac>
-->
<pathid="classpath">
<!--本项目只有一个java,用不上classpath,这里只是做个例子-->
<pathelementlocation="${build.classes}"/>
<pathelementpath="${java.home}/lib/tools.jar"/>
</path>
<!--
===================================================================
init准备目录(FileTasks)
主要的目录结构通常是不会变的,一起生成他们
===================================================================
-->
<targetname="init">
<!--清除以前目录-->
<deletedir="${build.dir}"fail="false"/>
<deletedir="${dist.dir}"fail="false"/>
<!--准备目录-->
<mkdirdir="${build.dir}"/>
<mkdirdir="${build.classes}"/>
<mkdirdir="${build.docs}"/>
<mkdirdir="${build.docs.api}"/>
<mkdirdir="${build.lib}"/>
<mkdirdir="${dist.dir}"/>
<mkdirdir="${dist.bin}"/>
<mkdirdir="${dist.lib}"/>
</target>
<!--
===================================================================
Buildthecode(CompileTasks,FileTasks)
===================================================================
-->
<targetname="build"depends="init">
<!--编译-->
<javacsrcdir="${src.main}"destdir="${build.classes}">
<classpathrefid="classpath"/>
</javac>
</target>
<!--
===================================================================
打包文档(ArchiveTasks)
Createtheprojectjars:xxx1.jarandxxx2.jar
===================================================================
-->
<targetname="jars"depends="build">
<jarbasedir="${build.classes}"jarfile="${build.lib}/${app.jar}"/>
</target>
<!--
===================================================================
CreatestheAPIdocumentation
===================================================================
-->
<targetname="javadocs"
depends="jars"
deion="-->createstheAPIdocumentation">
<!--copydocs手册...-->
<copytodir="${build.docs}">
<filesetdir="${docs.dir}"/>
</copy>
<javadocpackagenames="hello.ant.*"
sourcepath="${src.main}"
defaultexcludes="yes"
destdir="${build.docs.api}"
author="true"
version="true"
use="true"
windowtitle="DocsAPI">
<doctitle><![CDATA[<h1>helloantDocsAPI</h1>]]></doctitle>
<bottom><![CDATA[<i>${app.copyright}</i>]]></bottom>
<tagname="todo"scope="all"deion="Todo:"/>
</javadoc>
</target>
<!--
===================================================================
Createthedistributionthatcanrun(ArchiveTasks)
主要是从各目录中把该copy的copy上
===================================================================
-->
<targetname="dist"depends="javadocs">
<!--copybin执行文件-->
<copytodir="${dist.bin}">
<filesetdir="${src.}/"/>
</copy>
<copytodir="${dist.docs}">
<filesetdir="${build.docs}/"/>
</copy>
<!--copylib文件-->
<copytodir="${dist.lib}">
<filesetdir="${build.lib}/"/>
</copy>
</target>
<!--
===================================================================
Cleanseverything(FileTasks)
例如可以删除build中的文件,留给你发挥吧
===================================================================
-->
</project>
build.xml多了些,但其实很简单:(注释比较详细可以参照,这里再简单说一下)
一个build.xml包含一个工程的自动化处理的完整xml说明,并且基本由3种东东组成:
<project>
1.全局变量的定义
<property/>
2.任务组
<target>
3.许多单项任务...像copy,delete,javac,jar...
<task1/>
<task2/>
<task3/>
</target>
</project>