javaant命令⼤全
1 Ant是什么?
Apache Ant 是⼀个基于 Java的⽣成⼯具。
⽣成⼯具在软件开发中⽤来将源代码和其他输⼊⽂件转换为可执⾏⽂件的形式(也有可能转换为可安装的产品映像形式)。随着应⽤程序的⽣成过程变得更加复杂,确保在每次⽣成期间都使⽤精确相同的⽣成步骤,同时实现尽可能多的⾃动化,以便及时产⽣⼀致的⽣成版本
2 下载、安装Ant
安装Ant
下载.zip⽂件,解压缩到c:\ant1.3(后⾯引⽤为%ANT_HOME%)
2.1 在你运⾏Ant之前需要做⼀些配置⼯作。
将bin⽬录加⼊PATH环境变量。
设定ANT_HOME环境变量,指向你安装Ant的⽬录。在⼀些OS上,Ant的脚本可以猜测ANT_HOME(U
nix和Windos NT/2000)-但最好不要依赖这⼀特性。
可选地,设定JAVA_HOME环境变量(参考下⾯的⾼级⼩节),该变量应该指向你安装JDK的⽬录。
注意:不要将Ant的ant.jar⽂件放到JDK/JRE的lib/ext⽬录下。Ant是个应⽤程序,⽽lib/ext⽬录是为JDK扩展使⽤的(如JCE,JSSE扩展)。⽽且通过扩展装⼊的类会有安全⽅⾯的限制。
2.2 运⾏Ant
运⾏Ant⾮常简单,当你正确地安装Ant后,只要输⼊ant就可以了。
没有指定任何参数时,Ant会在当前⽬录下查询l⽂件。如果到了就⽤该⽂件作为buildfile。如果你⽤ -find 选项。 Ant就会在上级⽬录中寻buildfile,直⾄到达⽂件系统的根。要想让Ant使⽤其他的buildfile,可以⽤参数 - buildfile file,这⾥file指定了你想使⽤的buildfile。
可以指定执⾏⼀个或多个target。当省略target时,Ant使⽤标签<project>的default属性所指定的target。
命令⾏选项总结:
ant [options] [target [target2 [target3] ...]]
Options:
-help print this message
-projecthelp print project help information
-version print the version information and exit
-quiet be extra quiet
-verbose be extra verbose
-debug print debugging information
-emacs produce logging information without adornments
-logfile file use given file for log output
-logger classname the class that is to perform logging
-listener classname add an instance of class as a project listener
-
buildfile file use specified buildfile
-find file search for buildfile towards the root of the filesystem and use the first one found
-Dproperty=value set property to value
例⼦
ant
使⽤当前⽬录下的l运⾏Ant,执⾏缺省的target。
ant -l
使⽤当前⽬录下的l运⾏Ant,执⾏缺省的target。
ant -l dist
使⽤当前⽬录下的l运⾏Ant,执⾏⼀个叫做dist的target。
ant -l -Dbuild=build/classes dist
使⽤当前⽬录下的l运⾏Ant,执⾏⼀个叫做dist的target,并设定build属性的值为build/classes。
3 编写l
Ant的buildfile是⽤XML写的。每个buildfile含有⼀个project。
buildfile中每个task元素可以有⼀个id属性,可以⽤这个id值引⽤指定的任务。这个值必须是唯⼀的。(详情请参考下⾯的Task⼩节)
3.1 Projects
project有下⾯的属性:
Attribute Description Required
name 项⽬名称. No
default 当没有指定target时使⽤的缺省target Yes
basedir ⽤于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时,该属性被
忽略。如果属性和basedir property都没有设定,就使⽤buildfile⽂件的⽗⽬录。 No
项⽬的描述以⼀个顶级的<description>元素的形式出现(参看description⼩节)。
⼀个项⽬可以定义⼀个或多个target。⼀个target是⼀系列你想要执⾏的。执⾏Ant时,你可以选择执⾏那个target。当没有给定target时,使⽤project的default属性所确定的target。
3.2 Targets
⼀个target可以依赖于其他的target。例如,你可能会有⼀个target⽤于编译程序,⼀个target⽤于⽣成可执⾏⽂件。你在⽣成可执⾏⽂件之前必须先编译通过,所以⽣成可执⾏⽂件的target依赖于编译target。Ant会处理这种依赖关系。
然⽽,应当注意到,Ant的depends属性只指定了target应该被执⾏的顺序-如果被依赖的target⽆法运⾏,这种depends对于指定了依赖关系的target就没有影响。
Ant会依照depends属性中target出现的顺序(从左到右)依次执⾏每个target。然⽽,要记住的是只要某个target依赖于⼀个target,后者就会被先执⾏。
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
假定我们要执⾏target D。从它的依赖属性来看,你可能认为先执⾏C,然后B,最后A被执⾏。错了,C依赖于B,B依赖于A,所以先执⾏A,然后B,然后C,最后D被执⾏。
⼀个target只能被执⾏⼀次,即时有多个target依赖于它(看上⾯的例⼦)。
如果(或如果不)某些属性被设定,才执⾏某个target。这样,允许根据系统的状态(java version, OS, 命令⾏属性定义等等)来更好地控制build的过程。要想让⼀个target这样做,你就应该在target元素中,加⼊if(或unless)属性,带上target因该有所判断的属性。例如:
<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>
如果没有if或unless属性,target总会被执⾏。
可选的description属性可⽤来提供关于target的⼀⾏描述,这些描述可由-projecthelp命令⾏选项输出。
将你的tstamp task在⼀个所谓的初始化target是很好的做法,其他的target依赖这个初始化target。要确保初始化target是出现在其他target依赖表中的第⼀个target。在本⼿册中⼤多数的初始化target的名字是"init"。
target有下⾯的属性:
Attribute Description Required
name target的名字 Yes
depends ⽤逗号分隔的target的名字列表,也就是依赖表。 No
if 执⾏target所需要设定的属性名。 No
unless 执⾏target需要清除设定的属性名。 No
description 关于target功能的简短描述。 No
3.3 Tasks
⼀个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编写),你可以利⽤下⾯的语句存取相应的实例。
注意1:如果task1还没有运⾏,就不会被⽣效(例如:不设定属性),如果你在随后配置它,你所作的⼀切都会被覆盖。
注意2:未来的Ant版本可能不会兼容这⾥所提的属性,因为很有可能根本没有task实例,只有proxies。
3.4 Properties
⼀个project可以有很多的properties。可以在buildfile中⽤property task来设定,或在Ant之外设定。⼀
个 property有⼀个名字和⼀个值。property可⽤于task的属性值。这是通过将属性名放在"${"和"}"之间并放在属性值的位置来实现的。例如如果有⼀个property builddir的值是"build",这个property就可⽤于属性值:${builddir} /classes。这个值就可被解析为build/classes。
内置属性
如果你使⽤了<property> task 定义了所有的系统属性,Ant允许你使⽤这些属性。例如,${os.name}对应操作系统的名字。
要想得到系统属性的列表可参考the Javadoc Properties。
除了Java的系统属性,Ant还定义了⼀些⾃⼰的内置属性:
basedir project基⽬录的绝对路径 (与<project>的basedir属性⼀样)。
ant.file buildfile的绝对路径。
ant.version Ant的版本。
ant.project.name 当前执⾏的project的名字;由<project>的name属性设定.
ant.java.version Ant检测到的JVM的版本;⽬前的值有"1.1", "1.2", "1.3" and "1.4".
例⼦
<project name="MyProject" default="dist" basedir=".">
<!-- set global properties for this build -->
<property name="src" value="."/>
<property name="build" value="build"/>
<property name="dist" value="dist"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init">
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile">
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean">
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
3.5 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}"/>
命令⾏变量
有些task可接受参数,并将其传递给另⼀个进程。为了能在变量中包含空格字符,可使⽤嵌套的arg元素。
Attribute Description Required
value ⼀个命令⾏变量;可包含空格字符。只能⽤⼀个
line 空格分隔的命令⾏变量列表。
file 作为命令⾏变量的⽂件名;会被⽂件的绝对名替代。
path ⼀个作为单个命令⾏变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。
例⼦
<arg value="-l -a"/>
是⼀个含有空格的单个的命令⾏变量。
<arg line="-l -a"/>
是两个空格分隔的命令⾏变量。
<arg path="/dir;/dir2:\dir3"/>
是⼀个命令⾏变量,其值在DOS系统上为\dir;\dir2;\dir3;在Unix系统上为/dir:/dir2:/dir3 。
References
buildfile元素的id属性可⽤来引⽤这些元素。如果你需要⼀遍遍的复制相同的XML代码块,这⼀属性就很有⽤--如多次使⽤<classpath>结构。
下⾯的例⼦:
<project ... >
<target ... >
<rmic ...>
<classpath>
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</classpath>
</rmic>
</target>
<target ... >
<javac ...>
<classpath>
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</classpath>
</javac>
</target>
</project>
可以写成如下形式:
<project ... >
<path id="project.class.path">
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</path>
<target ... >
<rmic ...>
<classpath refid="project.class.path"/>
</rmic>
</target>
<target ... >
<javac ...>
<classpath refid="project.class.path"/>
</javac>
</target>
</project>
所有使⽤PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引⽤。
4.1 File(Directory)类
4.1.1 Mkdir
创建⼀个⽬录,如果他的⽗⽬录不存在,也会被同时创建。
例⼦:
<mkdir dir="build/classes"/>
说明:如果build不存在,也会被同时创建
4.1.2 Copy
拷贝⼀个(组)⽂件、⽬录
例⼦:
1. 拷贝单个的⽂件:
<copy file="" tofile=""/>
2. 拷贝单个的⽂件到指定⽬录下
<copy file="" todir="../some/other/dir"/>
3. 拷贝⼀个⽬录到另外⼀个⽬录下
<copy todir="../new/dir">
<fileset dir="src_dir"/>
</copy>
4. 拷贝⼀批⽂件到指定⽬录下
<copy todir="../dest/dir">
<fileset dir="src_dir">
<exclude name="**/*.java"/>
</fileset>
</copy>
<copy todir="../dest/dir">
<fileset dir="src_dir" excludes="**/*.java"/>
</copy>
5. 拷贝⼀批⽂件到指定⽬录下,将⽂件名后增加。Bak后缀
<copy todir="../backup/dir">
<fileset dir="src_dir"/>
<mapper type="glob" from="*" to="*.bak"/>
</copy>
6. 拷贝⼀组⽂件到指定⽬录下,替换其中的@标签@内容
<copy todir="../backup/dir">
<fileset dir="src_dir"/>
<filterset>
<filter token="TITLE" value="Foo Bar"/>
</filterset>
</copy>
4.1.3 Delete
删除⼀个(组)⽂件或者⽬录
例⼦
1. 删除⼀个⽂件
<delete file="/lib/ant.jar"/>
2. 删除指定⽬录及其⼦⽬录
<delete dir="lib"/>
3. 删除指定的⼀组⽂件
<delete>
<fileset dir="." includes="**/*.bak"/>
</delete>
4. 删除指定⽬录及其⼦⽬录,包括他⾃⼰
<delete includeEmptyDirs="true">
<fileset dir="build"/>
</delete>
4.1.4 Move
移动或重命名⼀个(组)⽂件、⽬录
例⼦:
1. 移动或重命名⼀个⽂件
<move file="ig" tofile="ved"/>
2. 移动或重命名⼀个⽂件到另⼀个⽂件夹下⾯
<move file="ig" todir="dir/to/move/to"/>
3. 将⼀个⽬录移到另外⼀个⽬录下
<move todir="new/dir/to/move/to">
<fileset dir="src/dir"/>
</move>
4. 将⼀组⽂件移动到另外的⽬录下
<move todir="some/new/dir">
<fileset dir="my/src/dir">
<include name="**/*.jar"/>
<exclude name="**/ant.jar"/>
</fileset>
</move>
5. 移动⽂件过程中增加。Bak后缀
<move todir="my/src/dir">
<fileset dir="my/src/dir">
<exclude name="**/*.bak"/>
</fileset>
<mapper type="glob" from="*" to="*.bak"/>
</move>
4.2 Java相关
4.2.1 Javac
编译java原代码
例⼦
1. <javac srcdir="${src}"
destdir="${build}"
classpath="xyz.jar"
debug="on"
/>
编译${src}⽬录及其⼦⽬录下的所有。Java⽂件,。Class⽂件将放在${build}指定的⽬录下,classpath表⽰需要⽤到的类⽂件或者⽬录,debug设置为on表⽰输出debug信息2. <javac srcdir="${src}:${src2}"
destdir="${build}"
includes="mypackage/p1/**,mypackage/p2/**"
excludes="mypackage/p1/testpackage/**"
classpath="xyz.jar"
debug="on"
/>
编译${src}和${src2}⽬录及其⼦⽬录下的所有。Java⽂件,但是package/p1/**,mypackage/p2/**将被编译,⽽ mypackage/p1/testpackage/**将不会被编译。Class⽂件将放在${build}指定的⽬录下,classpath表⽰需要⽤到的类⽂件或者⽬录,debug设置为on表⽰输出debug信息
3. <property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>
<javac srcdir="${src}"
destdir="${src}"
classpath="${classpath}"
debug="on"
/>
路径是在property中定义的
4.2.2 java
执⾏指定的java类
例⼦:
1. <java classname="test.Main">
<classpath>
<pathelement location="dist/test.jar"/>
<pathelement path="${java.class.path}"/>
</classpath>
</java>
classname中指定要执⾏的类,classpath设定要使⽤的环境变量
2. <path id="project.class.path">
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
xml标签大全<pathelement path="${additional.path}"/>
</path>
<target ... >
<rmic ...>
<classpath refid="project.class.path"/>
</rmic>
</target>
4.3 打包相关
4.3.1 jar
将⼀组⽂件打包
例⼦:
1. <jar destfile="${dist}/lib/app.jar" basedir="${build}/classes"/>
将${build}/classes下⾯的所有⽂件打包到${dist}/lib/app.jar中
2. <jar destfile="${dist}/lib/app.jar"
basedir="${build}/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
/>
将${build}/classes下⾯的所有⽂件打包到${dist}/lib/app.jar中,但是包括mypackage/test/所有⽂件不包括所有的Test.class
3. <jar destfile="${dist}/lib/app.jar"
basedir="${build}/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
manifest=”my.mf”
/>
manifest属性指定⾃⼰的META-INF/MANIFEST.MF⽂件,⽽不是由系统⽣成
4.3.2 war
对Jar的扩展,⽤于打包Web应⽤
例⼦:
假设我们的⽂件⽬录如下:
thirdparty/libs/jdbc1.jar
thirdparty/libs/jdbc2.jar
build/main/com/myco/myapp/Servlet.class
src/l
src/html/myapp/index.html
src/jsp/myapp/front.jsp
src/graphics/images/gifs/small/logo.gif
src/graphics/images/gifs/large/logo.gif
下⾯是我们的任务的内容:
<war destfile="myapp.war" webxml="src/l">
<fileset dir="src/html/myapp"/>
<fileset dir="src/jsp/myapp"/>
<lib dir="thirdparty/libs">
<exclude name="jdbc1.jar"/>
</lib>
<classes dir="build/main"/>
<zipfileset dir="src/graphics/images/gifs"
prefix="images"/>
</war>
完成后的结果:
l
WEB-INF/lib/jdbc2.jar
WEB-INF/classes/com/myco/myapp/Servlet.class
META-INF/MANIFEST.MF
index.html
front.jsp
images/small/logo.gif
images/large/logo.gif
4.3.3 ear
⽤于打包企业应⽤
例⼦
<ear destfile="${build.dir}/myapp.ear" appxml="${src.dir}/l">
<fileset dir="${build.dir}" includes="*.jar,*.war"/>
</ear>
4.4 时间戳
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论