文档章节

使用Ant打包java程序

mickelfeng
 mickelfeng
发布于 2017/09/07 14:30
字数 2295
阅读 7
收藏 0
点赞 0
评论 0

Ant是一个构建工具,它可以帮助我们将项目开发过程中需要完成的各种步骤组织起来,通过一个简易的方式来构建整个项目。
一些典型的任务是:编译Java源代码、运行java程序、拷贝文件或目录、将编译完成的类打包等等。

一、 安装与配置

下载Ant,当前版本是1.9.4。http://ant.apache.org/bindownload.cgi

解压文件到目录D:\Software\develop\apache-ant-1.9.4

添加环境变量ANT_HOME,指向Ant解压后的目录。

测试Ant是否可用:

在命令行进入到Ant目录下的bin目录,运行ant -version。如果成功,显示结果如下:

备注:运行Ant时,需要进入Ant的bin目录。在环境变量path中添加Ant的bin目录,就能在任何目录下运行Ant。

二、ant关键元素

Ant的构件文件是基于XML编写的,默认名称为build.xml。为了更清楚的了解Ant,在这里编写一个简单的Ant程序,用来展现Ant的功能。

首先在E盘下建立一个build.xml文件,内容如下:

<?xml version="1.0"?>  
<project name="helloWorld">  
       <target name="sayHelloWorld">  
              <echo message="Hello,Amigo"/>  
       </target>  
</project>  

进入E盘,运行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命令,可看到运行的结果,如下所示:

Buildfile: E:\workspace\scrawl\build.xml
sayBaseDir:
     [echo] The base dir is: E:\workspace\scrawl
BUILD SUCCESSFUL
Total time: 109 milliseconds

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.4;
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工具中每一个任务封装了具体要执行的功能,是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="scrawl" 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>  

程序运行出错:

BUILD FAILED  
E:\workspace\scrawl\build.xml:9: Unable to find a javac compiler;  
com.sun.tools.javac.Main is not on the classpath.  
Perhaps JAVA_HOME does not point to the JDK.  
It is currently set to "C:\Program Files\Java\jre7" 

因为JAVA_HOME没有设定。对于单独一个类,不需要依赖其它jar包的工程是可以的。

2 用java任务运行java程序

Ant中可以使用java任务实现运行Java程序的功能。下面在1的例子中进行如下的修改,修改后的build.xml文件的内容如下:

<?xml version="1.0"?>  
<project name="javaTest" 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>  

运行ant,即可输出结果。

3 使用jar任务生成jar文件

<target name="jar" depends="run">  
<jar destfile="helloworld.jar" basedir="build/classes">  
           <manifest>  
              <attribute name="Main-class" value="HelloWorld"/>  
           </manifest>  
       </jar>  
</target>  


此时将ant的project的default属性设置为jar,同时运行该build.xml文件,运行完毕后,可看到在工程目录下生成了一个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>  

 

本文转载自:http://blog.csdn.net/jay_1989/article/details/53579677

共有 人打赏支持
mickelfeng

mickelfeng

粉丝 227
博文 2557
码字总数 552015
作品 0
成都
高级程序员
用Ant实现Java项目的自动构建和部署

Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能。在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作。 一. 安装与配置 下载...

chunhei2008
2014/08/26
0
0
Linux,maven,redis,android,java,yum,ant部署相关命令

(linux系统查看) getconf LONG_BIT 查看系统位数 (java环境变量) export JAVAHOME=/home/gcweb/usr/java/jdk1.7.045 export PATH=$JAVA_HOME/bin:$PATH 如果需要修改到系统变量中: cd ~ vi .......

shengguimin
06/26
0
0
android使用ant重新编译打包apk

最近在一个android项目中遇到了这样一个需求,对于不同的客户需要不同的apk名称,icon,并对apk进行不同的配置。 从原理上讲,这是比较简单的,无非是对values/string.xml中相关字段进行修改...

bigtiger02
2014/02/21
0
7
EClipse + Jdk + ApacheAnt + jetty + GWT + MySQL(Navicat)

  阅读: 47 评论: 0 作者: blackcore 发表于 2009-11-25 11:22 原文链接 1.  JDK6 安装的jdk.exe已经已经包含了jre. JDK里面的三个变量path,JAVA_HOME和CLASSPATH的变量值 设置运行环境参...

agile
2009/12/30
0
0
使用Ant 实现批量打包Android应用

由于公司运维需要以及应用中需要加上应用推广的统计,往往要对应二三十个渠道,按照正常方法一个一个的去生成不同渠道包的应用,不仅浪费了时间,而且大大降低了效率. 上一篇讲到使用Ant进行...

Easince
2012/11/27
0
0
Qt 笔记(记录使用Qt中遇到的一些问题)

1.VS2008中无法自动更新Translation文件的问题: V2008-Qt-Qt Options-Qt Default Settings:lupdateOnBuild选择True 发现功能右键里面多了 lupdate all .ts files in project。 如果无法点击...

木头r
2012/12/10
0
0
centos5.8安装 ant

ant版本:apache-ant-1.9.2-bin 第1步:下载ant apache-ant-1.9.2-bin.tar.gz 第2步:解压 tar -zxvf apache-ant-1.9.2-bin.tar.gz 第3步:将ant复制或移动到usr目录 mv apache-ant-1.9.......

chem_dev
2015/05/27
0
0
用Scala 开发 Spring MVC

最近尝试用scala来写spring应用。工程是通过ant来编译部署的,因为通过eclipse直接部署到tomcat的话,scala文件不会被编译。后来才发现Spring已经有一个在开发中的项目 Spring Scala。后面有...

ForEleven
2013/04/17
0
14
Ant 中 *Log4j.properties 找不到文件的问题

在用 Ant 进行构建,部署,运行过程中,发现一小问题,就是在运行时总是提示“系统找不到指定的文件”。害得我花了不少时间,最后终于弄清楚了问题的原因。以下的错误代码(贴出来好让后面的...

xiaofer2008
2011/01/14
0
0
Java调用Ant API用法

Java调用Ant API用法 用法 API 调用 JAVA Ant是Java程序员的一个好的工具,主要可以帮助程序员进行java项目的的管理,包括批量编译、部署、文档生成等工作,其用途远不止如此,ant内置了大量...

光石头
2010/10/12
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7通过yum安装nginx

添加源地址(直接install可能不是最新版本的) sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 安装 sudo yum install -y ng......

iplusx
2分钟前
0
0
ef .core Dapper Helper

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Threading.Tasks; using Dapper; using Dap......

Lytf
3分钟前
0
0
iOS 小笔记

1.以下代码打印什么     __block int val = 10;    void (^blk)(void) = ^{        printf("val=%d\n",val);        };       val = 2;    blk(); /...

风了个1
5分钟前
0
0
【Spring Boot 系列 Spring Boot示例程序】

入门程序步骤,创建一个Maven项目。继承Spring Boot官方提供的父工程。再引入一个Web的应用启动器。 1、选择一个合适的IDEA工具 创建一个Maven工程,并添加如下配置 <parent> <...

HansonReal
7分钟前
0
0
217. Contains Duplicate - LeetCode

Question 217. Contains Duplicate Solution 题目大意:判断数组中是否有重复元素 思路:构造一个set,不重复就加进去,重复返回true,如果数据量大的话,可以用布隆过滤器 Java实现: publ...

yysue
11分钟前
0
0
istio 处理失败 (理论)

Envoy提供了一套开箱即用的选择加入故障恢复功能,可以通过应用程序中的服务进行利用。功能包括: 超时 具有超时预算和重试之间的可变抖动的有界重试 限制并发连接数和对上游服务的请求 对负...

xiaomin0322
12分钟前
0
0
eclipse解决git冲突举例

本地修改了两个文件,提交时提示有冲突,想来应该是没有从远程仓库下载最新代码导致的。通过右击项目 -> Team -> Sychronized WorkSpace,比较本地仓库和远程仓库的异同:   此时没有更好的...

Code辉
21分钟前
0
0
运行.jar后缀的文件

前提必须安装了jdk,正确配置环境变量。 在dos窗口执行以下命令即可。 java -jar C:\Users\10492\Desktop\turn.jar

haha360
23分钟前
0
0
Java程序员如何做代码压力测试?【JWordPress前台项目实战】

代码 pom.xml文件引入包 <dependency><groupId>com.taobao.stresstester</groupId><artifactId>stresstester</artifactId><version>1.0</version></dependency> 编写测试代码 /**......

迷你芊宝宝
28分钟前
0
0
面试宝典-什么是缓存穿透?

缓存穿透是说收到了一个请求,但是该请求缓存里没有,只能去数据库里查询,然后放进缓存。 这里面有两个风险,一个是同时有好多请求访问同一个数据,然后业务系统把这些请求全发到了数据库;...

suyain
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部