📄 ant入门教程.htm
字号:
href="http://www.apache.org/">http://www.apache.org/</A>。</DIV>
<DIV>其次,解压缩文件,放到指定的系统目录中,例如C:\Ant。</DIV>
<DIV>再次,将其添加到path,以便从命令行使用。(一些IDE,例如Eclipse可以不需要设置path,而通过IDE相关设置将Ant添加到path中。)</DIV>
<DIV>再次,设置一些环境变量指向JDK以及ANT。</DIV>
<DIV>最后,添加需要的可选库。</DIV>
<DIV> </DIV>
<DIV>在Windows安装过程(以笔者的安装过程为例)</DIV>
<DIV> 下载apache-ant-1.6.5-bin.zip到本地硬盘,解压缩之后将文件夹命名为Ant,放在C:\Ant中。这个目录就是Ant主目录。</DIV>
<DIV>应该将主目录中的bin目录添加到path属性中,这样就可以在命令行中调用ant命令,ANT_HOME是批处理文件所在目录的上级目录。最好明确设定。</DIV>
<DIV><SPAN
style="COLOR: black">现在许多工具已经集成了特定版本的</SPAN><SPAN
style="COLOR: black">Ant</SPAN><SPAN
style="COLOR: black">,一些操作系统甚至默认的已经安装了</SPAN><SPAN
style="COLOR: black">Ant</SPAN><SPAN
style="COLOR: black">。所以,你的系统中可能已经安装了</SPAN><SPAN
style="COLOR: black">Ant</SPAN><SPAN
style="COLOR: black">。</SPAN></DIV>
<DIV>首先可以通过运行以下命令:<BR><STRONG>ant
-version</STRONG><BR>和<BR>ant -diagnostics
<BR>来确定。我们推荐您不设置CLASSPATH来运行Ant命令。如果任何版本的Ant可以从CLASSPATH加载
,这时就会由于加载了不兼容的类而产生许多错误。</DIV>
<DIV> </DIV>
<DIV>一些其他问题请参阅Ant的FAQ设置。</DIV>
<DIV>正常情况下,执行ant ?Cversion即可显示Ant版本,则说明安装配制成功:</DIV>
<DIV><BR><IMG alt=""
src="Ant入门教程_files/ea29812585e24474a75be50e7407e4be.png"></DIV>
<DIV> </DIV>
<DIV
style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><STRONG>5.<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></STRONG><STRONG>运行第一个构建文件:</STRONG></DIV>
<DIV
style="MARGIN-LEFT: 21pt">首先创建一个Java工程,名为AntProject,工程中源文件和目标文件是分开的,分别为文件夹src和bin,然后创建一个Java类文件,类名为</DIV>
<DIV
style="MARGIN-LEFT: 21pt">com.neusoft.test.AntTest,只是为了测试,所以类的内容很简单:</DIV>
<DIV style="MARGIN-LEFT: 21pt">package
com.neusoft.test;</DIV>
<DIV style="MARGIN-LEFT: 21pt">/**</DIV>
<DIV style="MARGIN-LEFT: 21pt"> *This is just a
test class.</DIV>
<DIV style="MARGIN-LEFT: 21pt"> */</DIV>
<DIV style="MARGIN-LEFT: 21pt">public class
AntTest{</DIV>
<DIV
style="MARGIN-LEFT: 21pt">
public static void main(String[] args){</DIV>
<DIV
style="MARGIN-LEFT: 21pt">
for(int i=0;i<args.length;i++){</DIV>
<DIV
style="MARGIN-LEFT: 21pt">
System.out.println(args[i]);</DIV>
<DIV
style="MARGIN-LEFT: 21pt">
}</DIV>
<DIV
style="MARGIN-LEFT: 21pt">
}</DIV>
<DIV style="MARGIN-LEFT: 21pt">}</DIV>
<DIV style="MARGIN-LEFT: 21pt"> </DIV>
<DIV
style="MARGIN-LEFT: 21pt"><STRONG>然后我们在工程的路径下面建立一个构建文件</STRONG><STRONG>build.xml</STRONG><STRONG>,内容如下:</STRONG></DIV>
<DIV><?xml version="1.0" ?></DIV>
<DIV><project name="structured" default="archive"
></DIV>
<DIV style="TEXT-INDENT: 21pt"><target
name="init"></DIV>
<DIV style="TEXT-INDENT: 21pt"><mkdir
dir="build/classes" /></DIV>
<DIV style="TEXT-INDENT: 21pt"><mkdir dir="dist"
/></DIV>
<DIV style="TEXT-INDENT: 21pt"></target></DIV>
<DIV style="TEXT-INDENT: 21pt"><target name="compile"
depends="init" ></DIV>
<DIV style="TEXT-INDENT: 21pt"> <javac
srcdir="src" destdir="build/classes"/></DIV>
<DIV style="TEXT-INDENT: 21pt"></DIV>
<DIV style="TEXT-INDENT: 21pt"></target></DIV>
<DIV style="TEXT-INDENT: 21pt"><target name="archive"
depends="compile" ></DIV>
<DIV style="TEXT-INDENT: 21pt"><jar
destfile="dist/project.jar"</DIV>
<DIV style="TEXT-INDENT: 21pt">basedir="build/classes"
/></DIV>
<DIV style="TEXT-INDENT: 21pt"></target></DIV>
<DIV style="TEXT-INDENT: 21pt"><target name="clean"
depends="init"></DIV>
<DIV style="TEXT-INDENT: 21pt"><delete dir="build"
/></DIV>
<DIV style="TEXT-INDENT: 21pt"><delete dir="dist"
/></DIV>
<DIV style="TEXT-INDENT: 21pt"></target></DIV>
<DIV></project><BR></DIV>
<DIV>构建文件说明如下图:</DIV>
<DIV style="TEXT-INDENT: 21pt"><IMG alt=""
src="Ant入门教程_files/d13b06a92da34475a024ee7923683186.png"></DIV>
<DIV><BR><BR>关于XML的知识,请参考其他书籍,这里不做介绍。</DIV>
<DIV>以上创建完成后,目录结构如下图:<BR><BR></DIV>
<DIV><BR><IMG alt=""
src="Ant入门教程_files/18957dabfc4747ea9fa861b1101371af.png"></DIV>
<DIV><BR> </DIV>
<DIV> Ant构建文件总是有一个<project>元素做为根元素,它有两个属性,name和default,<target>元素是<project>元素的子元素,可以有多个,它有两个属性,name和depends,<target>元素包含的元素就是一些任务元素。<BR><BR></DIV>
<DIV><target>可以由命令行进行显示的调用,也可以在内部使用如可以直接调用ant
init、ant
compile等。如果不写参数,则默认的build文件是build.xml,默认的目标是<project>的default属性定义的目标。目标的名称是唯一的,可以是任意字符串。</DIV>
<DIV> </DIV>
<DIV>下面我们先运行一下这个Ant构建,再讲解其他的内容,进入工程目录,执行</DIV>
<DIV>ant</DIV>
<DIV>这里就相当于执行默认的目标,也就是<project name="structured"
default="archive" >中的archive目标。</DIV>
<DIV><BR><IMG alt=""
src="Ant入门教程_files/bf58caa3631043c9934e37a8c6842cd3.png"></DIV>
<DIV> </DIV>
<DIV>这里说明了首先初始化创建两个目录,然后编译了一个JAVA文件,然后进行了打包的操作。</DIV>
<DIV> </DIV>
<DIV><STRONG>这里讲解一下如果构建失败了怎么办?</STRONG></DIV>
<DIV>首先有可能是XML语法书写不正确(将<target>写成<targe>),或者在任务执行过程中出现了错误(.java文件中包含编译错误),或者任务名称书写错误(将<javac>写成<javacc>)等等,这些都不是Ant的错误,不需要填写Bug
Report。写XML时一定要细心,一些IDE已经有验证功能,可以很好的防止书写的错误。</DIV>
<DIV> </DIV>
<DIV><STRONG>出现错误时,可以使用</STRONG></DIV>
<DIV>ant ?Cverbose</DIV>
<DIV>或者</DIV>
<DIV>ant ?Cdebug来获取更加详细的构建信息,以解决问题。</DIV>
<DIV>下图是使用ant ?Cverbose时的输出,使用ant
?Cdebug将获取比这更详细的信息,这里就不举例了。</DIV>
<DIV><BR><IMG alt=""
src="Ant入门教程_files/457f2ee754f04d1380a08a6bc45e55b9.png"></DIV>
<DIV> </DIV>
<DIV>本例中直接使用了软件工程中的构建结构,使用src作为源文件目录,build/class作为中间生成文件,以dist作为可发布文件。在最后把一些可执行文件可以放在bin目录中。此时目录结构如下图所示:</DIV>
<DIV><BR><IMG alt=""
src="Ant入门教程_files/3112c28771af45a3be22d7e26e77836d.png"></DIV>
<DIV> </DIV>
<DIV>我们需要一种办法来确定某些任务先执行,而有些任务后执行,比如必须先编译,才能执行程序或者打包。我们在声明目标的时候,就在其依赖属性中列出其依赖关系:</DIV>
<DIV><target name="compile" depends="init" ></DIV>
<DIV><target name="archive" depends="compile"
></DIV>
<DIV><target name="clean" depends="init"></DIV>
<DIV>如果一个目标依赖与多个其他目标,需要将它们都写到依赖属性中,例如:</DIV>
<DIV>depents=”compile,test”。在我们的构建中,archive依赖于init和compile,但是我们不需要去写,因为compile已经依赖于init了。即:Ant的依赖关系是传递的,但不是自反的。</DIV>
<DIV><BR><IMG alt=""
src="Ant入门教程_files/ca47e0d3fd364097922f0f809a976277.png"></DIV>
<DIV><BR>如果在执行过程中两个目标共享同一个目标,则先导目标只被执行一次。</DIV>
<DIV>可以通过指定目标来运行构建:</DIV>
<DIV>例如执行完ant后,可以执行ant clean来清理构建:</DIV>
<DIV><BR><IMG alt=""
src="Ant入门教程_files/19f835f2ad08455fa56fb807fa63c69e.png"></DIV>
<DIV> </DIV>
<DIV>ant等价于ant archive</DIV>
<DIV>ant init</DIV>
<DIV>ant clean</DIV>
<DIV>ant compile</DIV>
<DIV>ant archive</DIV>
<DIV>ant clean archive</DIV>
<DIV> </DIV>
<DIV><STRONG>当构建完成一次以后,再次执行构建会发生什么呢?</STRONG></DIV>
<DIV><BR><IMG alt=""
src="Ant入门教程_files/904f2e88b87947d09c5195ed45dbb523.png"></DIV>
<DIV> </DIV>
<DIV>第二次执行构建时只花了2s,相比第一次的4s。并且没有任何一个目标表示做了任何工作。</DIV>
<DIV>原因如下:所有的任务都检查了它们的依赖关系:</DIV>
<DIV><mkdir>没有创建目录因为已经存在</DIV>
<DIV><javac>比较了源文件和类文件的时间戳</DIV>
<DIV><jar>比较了要被加入文件与已经存在文件的时间</DIV>
<DIV>只有更新的时候才进行任务执行。</DIV>
<DIV> </DIV>
<DIV><STRONG>Ant</STRONG><STRONG>如何处理命令行上的多个目标?</STRONG></DIV>
<DIV>执行ant compile archive会怎么样?</DIV>
<DIV>先实验一下:</DIV>
<DIV><BR><IMG alt=""
src="Ant入门教程_files/b563e0adc32748f1a08f9ba0f2fb4667.png"></DIV>
<DIV> </DIV>
<DIV>Ant依次执行每个目标和其依赖目标,即Ant的执行顺序是init compile init
compile
archive,虽然这样看起来增加了额外的工作,但是通过上面的执行过程就会发现,由于其依赖性检查的阻止,第二次的init和compile并未真正的执行,执行时间与直接执行archive的时间是一样的。</DIV>
<DIV> </DIV>
<DIV><STRONG>运行程序:</STRONG></DIV>
<DIV>普通执行该类的方法是:</DIV>
<DIV>java ?Ccp build/class com.neusoft.test.AntTest
args1 args2</DIV>
<DIV>而我们使用Ant的任务来执行它仅仅需要增加一个任务,好处在于:</DIV>
<DIV
style="TEXT-INDENT: 21pt">让用于执行的目标依赖与编译的目标,确保运行最新版本</DIV>
<DIV style="TEXT-INDENT: 21pt">易于传递复杂参数</DIV>
<DIV style="TEXT-INDENT: 21pt">设置classpath更方便</DIV>
<DIV style="TEXT-INDENT: 21pt">在Ant自身的JVM中运行,载入更快</DIV>
<DIV style="TEXT-INDENT: 21pt"></DIV>
<DIV>增加一个新的目标:</DIV>
<DIV><target name="execute"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -