ant安装、环境变量配置及验证

Apache Ant,是apache工程的一个子工程,是一个基于JAVA的自动化脚本引擎,脚本格式为XML。除了做JAVA编译相关任务外,ANT还可以通过插件实现很多应用的调用。默认情况下,脚本文件名为build.xml 。ant类似于make工具,本身使用java类实现,要构建的工程的配置文件用xml格式描述,可以很方便实现多平台编译。
ant运行需要的build.xml是由一个Project组成,一个Project又由一个或多个target组成,一个target又由多个task组成,每个task都是通过一个实现特定接口的java类来完成

一、安装ant

到官方主页http://ant.apache.org下载,windows下选择zip格式进行下载

(需要提前安装jdk,并配置有关jdk的环境变量)

JAVA_HOME = C:\Java\jdk1.6.0_21(指java的安装目录,tomcat会从这里找java)

PATH = %JAVA_HOME%\bin;(指的是系统查找执行文件的位置,如果你想直接在命令行中运行某个项目,那么这个东西就必须在path目录里)

CLASSPATH = .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar(指的是java程序自动查找class的位置,如果在命令行中发现找不到某class,那么就需要考虑这个环境变量了)

Linux平台环境变量的配置大同小异,例如分隔符使用"/"


二、配置环境变量

window中设置ant环境变量:

ANT_HOME    C:/ apache-ant-1.8.1(在系统变量中增加)

path             C:/ apache-ant-1.8.1/bin(windows下是在已有的Administrator下的path环境变量后追加)

classpath      C:/apache-ant-1.8.1/lib

注意:【
  配置环境变量:我的电脑----属性-----高级----环境变量
      如:ANT_HOME:C:\apache-ant-1.8.1
      PATH:%ANT_HOME%\bin (为了方便在dos环境下操作)
     实验了总是失败,没办法换成地址 C:/ apache-ant-1.8.1/bin,而不再使用变量。。。成功了。。

三、验证ant

为了验证ant是否成功安装,可以进行如下操作:

依次选择:开始->运行->cmd,输入如下命令:ant

如果出现如下内容,说明安装成功:

Buildfile: build.xml does not exist!

Build failed

【说明ant安装成功!因为ant默认运行build.xml文件,这个文件需要我们建立。】

查看版本:ant  -version


但如果出现如下内容,说明安装成功:(可以重复前述步骤,直至安装成功。)

查看帮助信息:ant -help

'ant' 不是内部或外部命令,也不是可运行的程序或批处理文件。

 

从别处移动过来的:

使用:
(1)在D盘根目录下建立build.xml

1 <? xml version="1.0" encoding="GBK" ?>
2 < project  name ="测试脚本"  default ="copyfile"  basedir ="."   >
3     < target  name ="copyfile" >
4        < copy  file ="d:/a.txt"  todir ="e:/Temp"  overwrite ="true"   />
5     </ target >
6 </ project >


(2)在D盘根目录下建立文件a.txt。
(3)进入dos,
         d:
         ant
         
         此时可在E:/Temp目录下见到文件aa.txt,内容与a.txt一样,即拷贝成功!(需要cd到包含build.xml的目录)

如果中间提示类似如下错误:

Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar

这是因为JDK 的安装有问题或者是 JAVA_HOME 环境变量没有设置或者设置有问题, jre下肯定没tools.jar。 


例子:

<?xml version="1.0"?>

<project name="antPro" default="getBaseDir" basedir="C:/ThinkInJavaCode">

<target name="getBaseDir">

<echo message="The base dir is:${basedir}"/>

</target>

</project>

进入C:/ThinkInJavaCode后运行ant命令,得到的结果为:

Buildfile:C:\ThinkInJavaCode\build.xml

sayBaseDir:

[echo] The base dir is:C:ThinkInJavaCode

BUILD SUCCESSFUL

Toal time:0 seconds



四、建立build.xml

用ant编译规模较大的工程非常方便,每个工程都对应一个build.xml文件,这个文件包含与这个工程有关的路径信息和任务,下面给出一个例子

<?xml version="1.0" encoding="UTF-8"?>

<project name="dev" basedir="." default="dist">


<target name="init">

<property name="app.name" value="Chess"/>

<property name="app.vendor" value="Nokia"/>

<property name="app.midlet" value="GameMIDlet"/>

<property name="app.project" value="antdemo"/>

<property name="app.description" value="A demo for ant development"/>

<property name="app.price" value="10"/>

<property name="LIB_PATH" value="../lib"/>

<property name="compile.classpath" value="${LIB_PATH}/nokia60.zip"/>

<property name="proguard.classpath" value="${LIB_PATH}/proguard.jar;${compile.classpath}"/>

</target>


<target name="clean" depends="init">

<mkdir dir="dist"/>

<delete file="dist/${app.project}.jad"/>

<delete file="dist/${app.project}.jar"/>

<delete file="temp"/>

</target>


<target name="compile" depends="clean">

<mkdir dir="temp/classes"/>

<javac srcdir="src" destdir="temp/classes" bootclasspath="${compile.classpath}" target="1.1" encoding="UTF-8"/>

</target>


<target name="obfuscate" depends="compile">

<jar jarfile="temp/${app.project}_tmp.jar" basedir="temp/classes"/>

<java fork="yes" classname="proguard.ProGuard" classpath="${proguard.classpath}">

<arg line="-libraryjars ${proguard.classpath}"/>

<arg line="-injars temp/${app.project}_tmp.jar"/>

<arg line="-outjars temp/${app.project}_obf.jar"/>

<arg line="-defaultpackage '' "/>

<arg line="-dontusemixedcaseclassnames"/>

<arg line="-keep public class ${app.midlet}"/>

<arg line="-overloadaggressively"/>

<arg line="-keepclasseswithmembers public class ${app.midlet} {public void startApp();public void destroyApp(boolean);}"/>

</java>

<mkdir dir="temp/obfuscate"/>

<unjar src="temp/${app.project}_obf.jar" dest="temp/obfuscate"/>

</target>


<target name="preverify" depends="obfuscate">

<mkdir dir="temp/build"/>

<exec executable="${LIB_PATH}/preverify.exe">

<arg line="-classpath ${compile.classpath} -d temp/build temp/obfuscate"/>

</exec>

</target>


<target name="copyres" depends="preverify">

<mkdir dir="temp/res"/>

<copy todir="temp/res">

<fileset dir="res" includes="manifest.mf,*.png"/>

</copy>

<copy todir="temp/build">

<fileset dir="res" excludes="manifest.mf,project.jad,*.png"/>

</copy>

</target>


<target name="replaceres" depends="copyres">

<replace file="temp/res/manifest.mf" encoding="UTF-8">

<replacefilter token="@NAME@" value="${app.name}"/>

<replacefilter token="@VENDOR@" value="${app.vendor}"/>

<replacefilter token="@MIDLET@" value="${app.midlet}"/>

</replace>

</target>


<target name="pngcrush" depends="replaceres">

<exec executable="${LIB_PATH}/pngcrush.exe">

<arg line="-d temp/build temp/res/*.png"/>

</exec>

</target>


<target name="dist" depends="pngcrush">

<jar jarfile="dist/${app.project}.jar" basedir="temp/build" manifest="temp/res/manifest.mf" manifestencoding="UTF-8"/>

<taskdef name="filesize" classname="ant.FileSizeTask" classpath="${LIB_PATH}/FileSizeTask.jar"/>

<filesize file="dist/${app.project}.jar" property="size"/>

<copy tofile="dist/${app.project}.jad" file="res/project.jad"/>

<replace dir="dist" includes="${app.project}.jad" encoding="UTF-8">

<replacefilter token="@NAME@" value="${app.name}"/>

<replacefilter token="@VENDOR@" value="${app.vendor}"/>

<replacefilter token="@MIDLET@" value="${app.midlet}"/>

<replacefilter token="@JAR@" value="${app.project}"/>

<replacefilter token="@FILESIZE@" value="${size}"/>

<replacefilter token="@DESCRIPTION@" value="${app.description}"/>

<replacefilter token="@PRICE@" value="${app.price}"/>

</replace>

</target>

</project>

解释:每个build.xml文件都包含一个project和至少一个target。target包含任务元素,任务是一段可执行代码,每个任务元素都有一个id属性,以便在文件中引用。property完成设置属性功能,javac完成编译java源文件功能(java源文件放在srcdir指定的文件夹中,生成的.class文件按照package语句组织目录,放在desdir指定的文件夹中。要注意源文件的目录组织要与package语句相一致),war完成打包功能。

project有name、default、basedir三个属性

default是必须的,表示默认的target,运行ant时如果不指定target,则用default指定的target

name指定工程的名字

basedir指定工程的基路径,设置为"."表示build.xml所在的路径;此属性没有指定时,使用ant的build.xml的父目录作为基路径

description:表示项目的描述


property介绍:

property元素可看做变量或者参数的定义(即经常使用的变量),project的属性可以通过property元素来设定,也可在ant之外设定。例如,若要在外部引入某文件(例如build.properties文件)则可以使用:

<property file="build.properties"/>

一个工程的property有名字和值,属性设置后可以在后面引用:

例如声明一个属性<property name="app.project" value="antdemo"/>,则在后面使用的时候src="temp/${app.project}_obf.jar"即为temp/antdemo_obf.jar

<property name="src" location="src"/>设置一个名字为src的属性,值是一个路径,用location标识,如果location内容以/或\或D:\之类开始表示绝对路径,否则表示相对路径,相对于project设置的basedir。如果不适用location而使用path或classpath,则可以设置类的路径,后面引用的时候用id设置的值。


target中的属性介绍:

属性name指定本target的名字,该名字在project中需要唯一(必须)

属性depends表示在执行本target之前必须要执行的target,如果此target需要依赖多个target,则以逗号隔开,ant会根据顺序依次执行

属性if:用于验证指定的属性是否存在,若不存在,所在target将不会被执行

属性unless:该功能与if属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在target将会被执行。

属性description:是关于target功能的简短描述和说明

<target name="A"/>

<target name="B" depends="A"/>

<target name="C" depends="B"/>

<target name="D" depends="C,B,A"/>

如果执行target D的话,会先执行A,然后执行B,然后执行C,最后执行D

一个target只能被执行一次,即使有多个target依赖于它


task中的属性介绍

一个task是一段可执行的代码

一个task可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对property的引用。这些引用会在task执行前被解析。

下面是Task的一般构造形式:
<name attribute1="value1" attribute2="value2" ... />
这里name是task的名字,attributeN是属性名,valueN是属性值。

有一套内置的(built-in)task,以及一些可选task,但你也可以编写自己的task。

所有的task都有一个task名字属性。Ant用属性值来产生日志信息。

可以给task赋一个id属性:
<taskname id="taskID" ... />
这里taskname是task的名字,而taskID是这个task的唯一标识符。通过这个标识符,你可以在脚本中引用相应的task。例如,在脚本中你可以这样:
<script ... >
task1.setFoo("bar");
</script>
设定某个task实例的foo属性。在另一个task中(用java编写),你可以利用下面的语句存取相应的实例。
project.getReference("task1").
注意1:如果task1还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。

注意2:未来的Ant版本可能不会兼容这里所提的属性,因为很有可能根本没有task实例,只有proxies。



Path-like Structures
你可以用":"和";"作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。

当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是
<classpath>
<pathelement path="${classpath}"/>
<pathelement location="lib/helper.jar"/>
</classpath>
location属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径--其他情况下,应该用多个location属性。

为简洁起见,classpath标签支持自己的path和location属性。所以:
<classpath>
<pathelement path="${classpath}"/>
</classpath>
可以被简写作:
<classpath path="${classpath}"/>
也可通过<fileset>元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。
<classpath>
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</classpath>
上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着是classes目录。

如果你想在多个task中使用相同的path-like structure,你可以用<path>元素定义他们(与target同级),然后通过id属性引用--参考Referencs例子。

path-like structure可能包括对另一个path-like structurede的引用(通过嵌套<path>元素):
<path id="base.path">
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</path>
<path id="tests.path">
<path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
前面所提的关于<classpath>的简洁写法对于<path>也是有效的,如:
<path id="tests.path">
<path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
可写成:
<path id="base.path" path="${classpath}"/>




对于上例,如果build.xml放在d\demo\下,则可以利用下面的三种方式进行执行

cd d\demo然后ant

ant -buildfile d\demo\build.xml

ant -buildfile d\demo\build.xml dist

(第二种和第三种效果相同是因为build.xml中指定了default的target为dist,所以最先运行dist(实际上dist指定了depends,则先运行dist所depends的target))


如果执行ant -buildfile d\demo\build.xml compile 则执行名字为compile的target

默认状态下ant是去执行build.xml,但是也可以取其他名字,不过在运行的时候要作为参数传入

ant -buildfile aaa.xml意思即运行aaa.xml文件


ant提供的内置属性:

basedir:  project 基目录的绝对路径

ant.file:   build.xml的绝对路径

ant.version: Ant的版本信息

ant.project.name: project的名字

ant.java.version: ant检测到的jdk版本


五、ant中常用的命令

1、copy命令

(1)复制单个文件

<copy file="original.txt" tofile="copied.txt"/>

(2)对文件目录进行复制

<copy todir="../dest_dir">

<fileset dir="src_dir"/>

</copy>

(3)将文件复制到另外的目录

<copy file="source.txt" todir="../home/philander"/>

overwrite:表示指定是否覆盖目标文件,默认是不覆盖

includeEmptyDirs:表示制定是否拷贝空目录,默认为拷贝

failonerror:如目标没有发现是否自动停止,默认值是停止

verbose:制定是否显示详细,默认值不显示

2、delete命令

(1)删除某个文件

<delete file="/home/photos/philander.jpg"/>

(2)删除某个目录

<delete dir="/home/photos"/>

(3)删除所有的备份目录或空目录(includeEmptyDirs表示指定是否要删除空目录,默认是删除)

<delete includeEmptyDirs="true">

<fileset dir="." includes="**/*.bak"/>

</delete>

failonerror:表示碰到错误是否停止,默认是自动停止

verbose:是否列出所删除的文件,默认为不列出

3、mkdir命令

<mkdir dir="/home/philander/build/classes"/>

4、move命令

(1)移动单个文件

<move file="sourcefile" tofile="destfile"/>

(2)移动单个文件到另一个目录:

<move file="sourcefile" todir="movedir"/>

(3)移动某个目录到另一个目录

<move todir="newdir">

<fileset dir="olddir"/>

</move>

5、echo命令

<echo message="Hello,ant" file="/home/philander/logs/ant.log" append="true" level="1">

执行该命令后,将生成ant.log文件并在其中显示Hello,ant


6、jar

用来生成一个jar文件

destfile:jar文件的文件名

basedir:被归档的文件名

includes:被归档的文件模式

excludes:被排除的文件模式


7、javac

用于编译一个或一组java文件

srcdir:表示源程序目录

destdir:class文件的输出目录

include:被编译的文件的模式

exclude:被排除的文件的模式

classpath:使用的类路径

debug:包含的调试

optimize:是否使用优化

verbose:提供详细的输出

fileonerror:当碰到错误就自动停止


8、java

用来生成.class文件

classname:将执行的类名

jar:包含该类的jar文件名

classpath:用到的类路径

fork:表示在一个新的虚拟机中运行该类

failonerror:当出现错误时自动停止

output:输出文件

append:追加或覆盖默认文件



六、编译项目时出现过的问题:

1、

'mode' 不是内部或外部命令,也不是可运行的程序或批处理文件。
'explorer' 不是内部或外部命令,也不是可运行的程序或批处理文件。
修改环境变量里的path值,在最前面加上 %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

2、
java.lang.OutOfMemoryError: requested 487424 bytes for card table expans

解决方法1:
  <target name="compile" depends="init">
  <javac srcdir="${src}" destdir="${dest}" debug="true" fork="true" memoryMaximumSize="512m">
   <classpath refid="project.class.path"/>
   <classpath refid="jspc.class.path"/>
  </javac>
 </target>

在javac的选项里增加 fork="true" memoryMaximumSize="512m"来加在编译时的内存

解决方法2:
在环境变量中新建JAVA_OPTS,值为: -Xms64m -Xmx512

解决方法3:
如果是用eclipse 开发,在用ant编译web工程时,碰到java.lang.OutOfMemoryError: Java heap space异常
window->preferences->java->installed jres->edit jre
把default vm arguments 的参数设为 -Xms64m -Xmx512

解决方法2是通用的方法,不管是直接用ant编译,还是在eclipse中用ant编译。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值