使用Ant打包Java程序

早在几年前用Ant打包过Java程序,后来就一直改用Maven了,现在又接手一个老Java项目,是用Ant打包的,因此特意回顾一下Ant的知识,以供日后学习查阅。


Ant是一个构建工具,它可以帮助我们将项目开发过程中需要完成的各种步骤组织起来,通过一个简易的方式来构建整个项目。

一些典型的任务是:编译Java源代码、运行java程序、拷贝文件或目录、将编译完成的类打包等等。

一、 安装与配置

下载Ant,当前版本是1.9.7。 http://ant.apache.org/bindownload.cgi
解压文件到目录E:\PCmall\apache-ant-1.9.7

添加环境变量ANT_HOME,指向E:\PCmall\apache-ant-1.9.7目录


编辑环境变量path,添加Ant的bin目录


测试Ant是否可用

进入cmd命令模式,运行ant -version。如果成功,显示结果如下:


二、Ant关键元素

Ant的构件文件是基于XML编写的,默认名称为build.xml。为了更清楚的了解Ant,在这里编写一个简单的Ant程序,用来展现Ant的功能。
首先在E:\jayworkspace\test盘下建立一个build.xml文件,内容如下:
<?xml version="1.0"?>  
<project name="helloWorld">  
       <target name="sayHelloWorld">  
              <echo message="Hello,Amigo"/>  
       </target>  
</project>
进入E:\jayworkspace\test盘,运行ant sayHelloWorld,展示如下:

接下来介绍本节重点:Ant的关键元素project、target、property、task。

1、project

project元素是Ant构件文件的根元素,Ant构件文件至少应该包含一个project元素,否则会发生错误。
在每个project元素下,可包含多个target元素。接下来向读者展示一下project元素的各属性。
1)name属性
用于指定project元素的名称。
2)default属性
用于指定project默认执行时所执行的target的名称。
3)basedir属性
用于指定基路径的位置。该属性没有指定时,使用Ant的构件文件的附目录作为基准目录。
下面给读者一个简单的例子来展示project的各元素的使用。修改build.xml文件,修改后的内容如下:
<?xml version="1.0"?>  
<project name="projectStudy" default="sayBaseDir" basedir="./">  
       <target name="sayBaseDir">  
              <echo message="The base dir is:${basedir}"/>  
       </target>  
</project>
从上面的内容我们可以看出,在这里定义了default属性的值为sayBaseDir。
即当运行ant命令时,若未指明执行的target时,默认执行的target的sayBaseDir。
同时还定义了basedir属性的值为"./",运行ant命令,可看到运行的结果,如下所示:

2、target

它为Ant的基本执行单元,它可以包含一个或多个具体的任务。多个target可以存在相互依赖关系。它有如下属性:
1)name属性
指定target元素的名称,这个属性在一个project元素中是唯一的。我们可以通过指定target元素的名称来指定某个target。
2)depends属性
用于描述target之间的依赖关系,若与多个target存在依赖关系时,需要以“,”间隔。
Ant会依照depends属性中target出现的顺序依次执行每个target。被依赖的target会先执行。
3)if属性
用于验证指定的属性是否存在,若不存在,所在target将不会被执行。
4)unless属性
该属性的功能与if属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在target将会被执行。
5)description属性
该属性是关于target功能的简短描述和说明。
修改build.xml的内容如下:
<?xml version="1.0"?>
<project name="targetStudy">
       <target name="targetA" if="ant.java.version">
              <echo message="Java Version: ${ant.java.version}"/>
       </target>
       <target name="targetB" depends="targetA" unless="amigo">
              <description>
                            a depend example!
              </description>
              <echo message="The base dir is: ${basedir}"/>
       </target>
</project>
运行ant targetB的结果:

因为有两个target,需要指定运行targetB。

3、property

该元素可看作参量或者参数的定义,project的属性可以通过property元素来设定,也可在Ant之外设定。
若要在外部引入某文件,例如build.properties文件,可以通过如下内容将其引入:<property file="build.properties"/>

property元素可用作task的属性值。在task中是通过将属性名放在“${”和“}”之间,并放在task属性值的位置来实现的。
Ant提供了一些内置的属性,它能得到的系统属性的列表与Java文档中System.getPropertis()方法得到的属性一致,这些系统属性可参考sun网站的说明。
同时,Ant还提供了一些它自己的内置属性,如下:
basedir:project基目录的绝对路径,该属性在讲解project元素时有详细说明,不再赘述;
ant.file:buildfile的绝对路径,如上面的各例子中,ant.file的值为E:"build.xml;
ant.version:Ant的版本,在本文中,值为1.9.7;
ant.project.name:当前指定的project的名字,即前文说到的project的name属性的值;
ant.java.version:Ant检测到的JDK的版本,在上例运行结果中可看到为1.7。

下面来看一个property元素使用的简单例子。修改build.xml文件,内容如下:
<?xml version="1.0"?>
<project name="propertyStudy" default="example">
<property name="name" value="amigo"/>
<property name="age" value="25"/>
<target name="example">
        <echo message="name: ${name}, age: ${age}"/>
</target>
</project>
运行ant example的结果:


三、常用任务

在Ant工具中每一个任务封装了具体要执行的功能,是Ant工具的基本执行单位。在本小节中,来看下Ant的常用任务及其使用举例。

1、copy任务

该任务主要用来对文件和目录的复制功能。举例如下:
Eg1.复制单个文件:<copy file="file.txt" tofile="copy.txt"/>
Eg2.对文件目录进行复制:
   <copy todir="../newdir/dest_dir"> <fileset dir="src_dir"/> </copy>
Eg3. 将文件复制到另外的目录:
   <copy file="file.txt" todir="../other/dir"/>

2、delete任务

对文件或目录进行删除,举例如下:
Eg1. 删除某个文件:<delete file="photo/amigo.jpg"/>
Eg2. 删除某个目录:<delete dir="photo"/>
Eg3. 删除所有的备份目录或空目录:
        <delete includeEmptyDirs="true">
               <fileset dir="." includes="**/*.bak"/>
        </delete>

3、mkdir任务

创建目录。eg:<mkdir dir="build"/>
4、move任务
移动文件或目录,举例如下:
Eg1. 移动单个文件:<move file="fromfile" tofile=”tofile”/>
Eg2. 移动单个文件到另一个目录:<move file="fromfile" todir=”movedir”/>
Eg3. 移动某个目录到另一个目录:
        <move todir="newdir"> <fileset dir="olddir"/> </move>

5、echo任务

该任务的作用是根据日志或监控器的级别输出信息。它包括message、file、append和level四个属性,举例如下:
<echo message="Hello,Amigo" file="logs/system.log" append="true">

四、利用ant构建java工程

Ant可以代替使用javac、java和jar等命令来执行java操作,从而达到轻松的构建和部署Java工程的目的。

1、用javac任务来编译java程序

首先我们建立名为antstudy的Java工程,建立src目录为源代码目录,在src目录下建立HelloWorld.java这个类文件。
同时在antstudy工程的根目录下建立build.xml文件,在该文件中编译src目录下的java文件,并将编译后的class文件放入build/classes目录中。在编译前,需清除classes目录。

<?xml version="1.0"?>
<project name="test" default="compile" basedir=".">
    <target name="clean">
       <delete dir="build"/>
    </target>

    <target name="compile" depends="clean">
       <mkdir dir="build/classes"/>
    <javac srcdir="src" destdir="build/classes"/>
    </target>
</project> 
程序运行结果如下:


2、用java任务运行java程序

Ant中可以使用java任务实现运行Java程序的功能。下面在1的例子中进行如下的修改,修改后的build.xml文件的内容如下:
<?xml version="1.0"?>
<project name="test" default="run" basedir=".">
    <target name="clean">
       <delete dir="build"/>
    </target>

    <target name="compile" depends="clean">
       <mkdir dir="build/classes"/>
      <javac srcdir="src" destdir="build/classes"/>
    </target>

    <target name="run" depends="compile">
       <java classname="HelloWorld">
           <classpath>
              <pathelement path="build/classes"/>
           </classpath>
       </java>
    </target>
</project>
程序运行结果如下:


3、使用jar任务生成jar文件

<?xml version="1.0"?>
<project name="test" default="jar" basedir=".">
    <target name="clean">
       <delete dir="build"/>
    </target>

    <target name="compile" depends="clean">
       <mkdir dir="build/classes"/>
      <javac srcdir="src" destdir="build/classes"/>
    </target>

    <target name="run" depends="compile">
       <java classname="HelloWorld">
           <classpath>
              <pathelement path="build/classes/"/>
           </classpath>
       </java>
    </target>
	<target name="jar" depends="run">
		<jar destfile="build/classes/helloworld.jar" basedir="build/classes">
			   <manifest>
				  <attribute name="Main-class" value="HelloWorld"/>
			   </manifest>
	    </jar>
	</target>
</project>
此时将ant的project的default属性设置为jar,同时运行该build.xml文件,运行完毕后,可看到在工程build/classes目录下生成了一个jar包HelloWorld.jar。




4、用Ant为java工程打包

<project default="jar" name="Acid">
    <!-- 工程目录结构
    project
        |-bin
        |-src
        |-lib
        |-out
        |-build.xml
    -->
    <property name="lib.dir" value="lib"/>
    <property name="src.dir" value="src"/>
    <property name="classes.dir" value="bin"/>

    <property name="output.dir" value="out"/>
    <property name="jarname" value="scrawl.jar"/>
    <property name="mainclass" value="com.sogou.scrawl.IndexFiles"/>

    <!-- 第三方jar包的路径 -->
    <path id="lib-classpath">
        <fileset dir="${lib.dir}">
            <include name="**/*.jar"/>
        </fileset>
    </path>

    <!-- 1. 初始化工作,如创建目录等 -->
    <target name="init">
        <mkdir dir="${classes.dir}"/>
        <mkdir dir="${output.dir}"/>
    </target>

    <!-- 2. 编译 -->
    <target name="compile" depends="init">
        <javac srcdir="${src.dir}" destdir="${classes.dir}">
            <compilerarg line="-encoding UTF-8"/>
            <classpath refid="lib-classpath"/>
        </javac>
    </target>

    <!-- 3. 打包jar文件 -->
    <target name="jar" depends="compile">
        <copy todir="${output.dir}/lib">
            <fileset dir="${lib.dir}"/>
        </copy>

        <!--Create a property containing all .jar files,
        prefix lib/, and seperated with a space-->
        <pathconvert property="mf.classpath" pathsep=" ">
            <mapper>
                <chainedmapper>
                    <!-- jar包文件只留文件名,去掉目录信息 -->
                    <flattenmapper/>
                    <!-- add lib/ prefix -->
                    <globmapper from="*" to="lib/*"/>
                </chainedmapper>
            </mapper>
            <path refid="lib-classpath"/>
         </pathconvert>

        <!-- jar文件的输出路径 -->
        <jar destfile="${output.dir}/${jarname}" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-class" value="${mainclass}"/>
                <attribute name="Class-Path" value="${mf.classpath}"/>
            </manifest>
        </jar>
    </target>
</project>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值