ant--Java工程打包工具

时间:2022-05-31 15:53:41

真是,博客停更了两个月,罪过罪过

        写这篇博客是简介一下ant。这是一个Java的打包工具。很像是C的Makefile工具。不过是基于xml格式的,所以在语法上可能会更随意一点,不会像是Makefile一样困扰于严格缩进的问题。

ant学习起来其实很简单,一篇博客的内容就可以了。因为知识点就那么多。不过也像是Makefile,打包一个大工程也是很不好写的,都是要处理好依赖关系。废话少说,下面进入正题。


一:安装

        这步,去ant.apache.org下载ant的二进制包(不要下载源码那个包,除非你想研究)。然后就想Java一样配置环境变量就ok了。环境变量指向bin目录。配置好了之后,就可以使用了。打开cmd,运行ant -version。


二:建立build.xml文件

        这就是一个简单的ant文件。

<project default="hello">
<target name="hello">
<echo message="hello , ant">
</target>
</project>

        保存为build.xml文件。在文件所在目录下执行:ant命令。会看到

$ ant
Buildfile: build.xml

hello:
[echo] Hello, World

BUILD SUCCESSFUL
Total time: 2 seconds
分析:从上面的例子中,我们可以看到。build.xml简单的有以下级别:

·projectproject标签是build文件的根元素,可以包括一个或多个target,default属性是必须的,并且指明默认执行的target。因为ant命令无参数指定时会运行default target

    ·target这个在后面有更深入的讨论,这里只要知道target的name属性是必须的就好了

        ·taskant中的最小单元,一般就是执行一些命令了

        这个树形关系是最基本的build文件结构。

        p.s.可以通过一些命令参数做一些事。比如下面这句会指定对echo.xml执行ant,同时指定goodbye为默认的target

ant -f echo.xml goodbye


三:开始,打包你的Java程序

        先简单的对付一个文件。先写一个hello world的Java程序吧(这里不写,并且不要问我理由)。为了节约篇幅,这里不一步一步讲了,就直接把“编译-打包-运行”都做得一个build文件内容发上来。

<project default="compile">
<target name="compile">
<javac srcdir="." />
</target>

<target name="jar" depends="compile">
<jar destfile="hello.jar"
basedir="."
includes="**/*.class"
<manifest>
<attribute name="Main-Class" value="hello" />
</manifest>
/>
</target>

<target name="run" depends="jar">
<java classname="hello"
classpath="hello.jar"
fork="true"
/>
</target>
</project>


 

        分析一下,很好读懂。

        1. 这个工程的默认执行是compile。这个target的task是执行javac命令(ant所支持的命令,后面的“java”也是)编译java文件。srcdir指定要编译的Java文件的所在位置。

        2. 第二个target是jar,后面这个depend="compile"很关键。表明命令之间的以来关系(我们总不能不编译就打包或者运行吧)。注意一下,在jar任务里我还指定生成manifest文件(这是Java的配置文件,不明白的一查就会懂了)

        3. 最后一个是run这个target,运行就是调用java命令就可以了,指定好相应的参数。这里熟悉java命令的同学应该很容易就明白了。另外,fork="true"表示请求用一个新的JVM运行。 

        运行一下,这里建议用命令ant run运行这个build文件。如果你指定了default="run",就直接ant就可以了。

        然后我们可以验证一下,用这个命令java -jar hello.jar。看到了么?

四:深入,打包你的Java工程--使用ant的properties

        还是先看内容:

<project default="all">
<property name="obj-dir" location="obj" />
<property name="lib-dir" location="lib" />
<property name="src-dir" location="src" />

<target name="init">
<mkdir dir="${obj-dir}" />
<mkdir dir="${lib-dir}" />
</target>
<target name="clean-init">
<delete dir="${obj-dir}" />
<delete dir="${lib-dir}" />
</target>

<target name="compile" depends="init">
<javac srcdir="${src-dir}"
destdir="${obj-dir}"
/>
</target>
<target name="clean-compile">
<delete>
<fileset dir="${obj-dir}" includes="**/*.class" />
</delete>
</target>

<target name="jar" depends="compile">
<jar destfile="${lib-dir}/hello.jar"
basedir="${obj-dir}"
/>
</target>

<target name="clean-jar">
<delete file="${lib-dir}/hello.jar" />
</target>
<target name="run" depends="jar">
<java classname="hello"
classpath="${lib-dir}/hello.jar"
fork="true"
/>
</target>

<target name="all" depends="run"/>

<target name="clean" depends="clean-init"/>
</project>

        tips:读build文件,最好就要根据default指定的target,根据依赖关系倒序读。

        分析一下,这个文件其实可以应对很多你的Java工程的(当然,这里我们忽略只有一个hello.java的事实)。温习一下,一个好的工程可以如下,一般都有obj、lib、src等有意义的目录。src目录存放源代码,obj存放编译好的代码(这里是.class),lib目录存放打包文件(生成的库)。感觉说了这些,上面的代码应该没什么问题了,需要注意的是,mkdir等标签其实调用的都是ant的命令。

        执行一下ant,运行成功。当你发现你想干掉你的文件,ant clean。这就是这个build文件里的其它target了。


五:what's more?

        就像是C的Makefile一样。ant也支持一些更复杂的操作,比如条件语句。这些一般用来写你的测试(test)任务,像上一小节的clean任务似的,这样你的工程看起来更加健壮。

        更好的使用ant来测试是使用Junit。不过这里不介绍了。

        关于更多的ant的Task,请看这里http://ant.apache.org/manual/tasksoverview.html。像是Property Tasks就很重要。

        另外推荐ant的官方帮助文档http://ant.apache.org/manual/index.html。内容不多,简单全面。


六:写在最后

        学习ant其实对我是出于无奈...hadoop的eclipse插件没搞定,就只好用ant了...不过感觉ant比eclipse更好些。