Ant使用指南

来源:互联网 发布:java颜色代码 编辑:程序博客网 时间:2024/05/16 12:41

ant的名称是another neat tool的首字母的缩写。最初的创始人James Duncan Davidson。

获取ant,http://ant.apache.org/。-bin.zip包。下载下来后配置下环境变量,ANT_HOME和path就可以了。配置环境变量的时候,注意最后一个不能有“;”

使用ant,可以编写单个生成文件,这个生成文件在任何Java平台上都一致的操作(因为ant本身也是使用Java语言来实现的),这就是Ant最大的优势。

ant的属性
1,ant中的属性一经设置,就不可更改。(除了使用java的自定义ant文件中setProperty修改)
2,利用这个特性,可以使用 -Dmetal=beryllium,注意-D没有空格。
3,ant中有许多预定义的属性。首先,Java环境设置用于运行Ant的所有系统属性,均可以作为Ant属性使用。比如${user.home}。除了这些,Ant还定义了它自己的一小组属性,包括${basedir}等。


属性经常用于引用文件系统上的文件或目录,但是对于使用不同的路径分隔符(例如,/与\)的平台来说,这样可能在跨越不同平台时导致问题。Ant的location属性专门设计用于以平台无关的方式包含文件系统路径。可以像下面这样使用location来代替value:
<property name="database-file" location="archive/databases/${metal}.db" />
用于location属性的路径分割字符将被转化为当前平台的正确格式;而且由于文件名是相对的,它被认为是相对于项目的基目录。同样可以写成下面这样:
<property name="database-file" location="archive\databases\${metal}.db" />
这个标签的两个版本都会在不同的平台具有相同的行为。如果可移植性是必须的,唯一要避免的内容就是文件名中的Dos风格的驱动器号。在可能的地方使用相对路径名称而不是绝对路径名称,这样还会更加灵活。

Ant的主要目标是生成Java应用程序,它能够内在地,出色的支持调用javac编译器以及其他java相关任务就毫不奇怪了。
像Ant一样,javac编译器本身也是java语言实现的。这对Ant中的javac任务的使用来说非常有利,因为通常调用Ant运行所在的Java虚拟机(JVM)中的编译器类。在每次需要编译java代码时,其他生成工具通常需要运行一个新的javac进程,从而需要一个新的JVM实例。而Ant不需要
如果想要单独地调用编译器----例如当你希望指定编译器的某些内存选项,或者需要使用一个不同级别的编译器的,只需要将javac的fork属性设置为true
<javac srcdir="src" fork="true" />

如果想要指定一个不同的javac可执行文件,并向它传递一个最大内存设置,可以像下面这样做:
<javac srcdir="src" fork="true" executable="d:\sdk\bin\javac" memoryMaximumSize="128m"/>

使用ant的时候有的时候在进行编译时说找不到javac,可能是因为机器中有多套jre的问题。手动指定jdk的目录可以解决问题。

jdk和jre的区别:

   JDK就是Java Development Kit
JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。

  1、为什么Sun要让JDK安装两套相同的JRE?这是因为JDK里面有很多用Java所编写的开发工具(如javac.exe、jar.exe等),而且都放置在 \lib\tools.jar 里。从下面例子可以看出,先将tools.jar改名为tools1.jar,然后运行javac.exe,显示如下结果: Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 这个意思是说,你输入javac.exe与输入 java -cp c:\jdk\lib\tools.jar com.sun.tools.javac.Main 是一样的,会得到相同的结果。从这里我们可以证明javac.exe只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。而且可以发现\lib目录下的程序都很小,不大于2 9K,从这里我们可以得出一个结论。就是JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程序,也必须要自行附一套JRE才行,所以位于C:\Program Files\Java目录下的那套JRE就是用来运行一般Java程序用的。 

更多的见:http://www.cnitblog.com/asfman/articles/30277.html



在编译后,类文件通常被打包到一个Jar文件中。每个Jar文件都包含一个清单文件,指定该Jar文件的属性。
最简单的例子
<jar destfile="${basedir}/package.jar" basedir="${targetdir}"/>
这里将把${targetdir}目录的所有文件添加到其中(任意类型,而不只是类文件)。如果不指定清单文件,ant将提供一个级别的清单文件。
manifest属性允许指定一个用作该JAR文件的清单的文件。如果只是个引用jar包,可以不指定,如果是可执行的jar,需要main-class。
如果还引用了第三方的jar包,也需要说明。
<jar basedir="${dest.dir}" destfile="${jar.file}">
<manifest>
<attribute name="Main-Class" value="${main.class}" />
<attribute name="Class-Path" value="" />
</manifest>
<zipfileset src="lib/ant-launcher.jar" excludes="META-INF/*" />
<zipfileset src="lib/ant.jar" excludes="META-INF/*" />  
</jar>


创建和解压缩zip及tar文件,和创建jar文件类似。

<zip destfile="output.zip" basedir="output" />

相同的语法也可用于创建tar文件。还可以使用gzip和bzip任务来压缩文件。例如:

<gzip src="output.tar" zipfile="output.tar.gz" />

解压缩和提取文件同样的简单:

<unzip src="output.tar.gz" dest="extractDir" />

还可以包括overwrite属性来控制覆盖行为。默认为true。相关的任务名称是untar,unjar,gunzip和bunzip2。

替换文件中的标记

replace任务,它执行文件中的查找和替换操作。token属性指定要查找的字符串,value属性指定一个新的字符串,查找到的标记字符串的所有实例都被替换为这个新的字符串。

<replace file="input.txt" token="old" value="new" />


ant中的条件判断

basic elements: istrue isfalse not and or xor available isset equals  filesmatch 

<project name="testCondition"><target name="test"><condition property="scondition"><istrue value="true"/></condition><antcall target="isTrue"></antcall><antcall target="isFalse"></antcall></target><target name="isTrue" if="scondition"><echo>is ture</echo></target><target name="isFalse" unless="scondition"><echo>is false</echo></target></project>
剩下的:

  1.         <condition property="scondition">  
  2.             <not>  
  3.                 <istrue value="true"/>  
  4.             </not>  
  5.         </condition> 

  1.         <condition property="scondition">  
  2.             <and>  
  3.                 <istrue value="true"/>  
  4.                 <istrue value="false"/>  
  5.             </and>  
  6.         </condition> 
  1.         <condition property="scondition">  
  2.             <!--在指定的classpath路径下是否存在资源 TestTest.class-->  
  3.             <available resource="TestTest.class">  
  4.                 <classpath refid="all.test.classes" />  
  5.             </available>  
  6.         </condition>  
  1.         <condition property="scondition">  
  2.             <!--如果属性name不存在则返回false-->  
  3.             <isset property="name" />  
  4.         </condition>  

  1.         <condition property="scondition">  
  2.             <!--如果arg1的值与arg2的值相等返回true,否则为false-->  
  3.             <equals arg1="${name}" arg2="this is name" />  
  4.         </condition> 

  1.         <condition property="scondition">  
  2.             <!--如果file1所代表的文件与file2所代表的文件相等返回true,否则为false-->  
  3.             <filesmatch file1="testfile1.txt" file2="testfile2.txt" />  
  4.         </condition> 


Path和ClassPath

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

当需要指定类似路径的值时,可以使用嵌套元素,一般的形式是

<classpath>

<pathelement path="${classpath}" />

<pathelement location="lib/helper.jar" />

</classpath> 

为简洁起见,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}"/>
五、Ant的数据类型
在构建文件中为了标识文件或文件组,经常需要使用数据类型。数据类型包含在org.apache.tool.ant.types包中。下面介绍构建文件中一些常用的数据类型。
 
1、argument 类型
 由Ant构建文件调用的程序,可以通过<arg>元素向其传递命令行参数,如apply,exec和java任务均可接受嵌套<arg>元素,可以为各自的过程调用指定参数。
 
以下是<arg>的所有属性:
values 是一个命令参数。如果参数种有空格,但又想将它作为单独一个值,则使用此属性。
file 表示一个参数的文件名。在构建文件中,此文件名相对于当前的工作目录。
line 表示用空格分隔的多个参数列表。
path 表示路径。
 
2、ervironment 类型
由Ant构建文件调用的外部命令或程序,<env>元素制定了哪些环境变量要传递给正在执行的系统命令,
 
<env>元素可以接受以下属性:
file 表示环境变量值得文件名。此文件名要被转换位一个绝对路径。
path 表示环境变量的路径。Ant会将它转换为一个本地约定。
value 表示环境变量的一个直接变量。
key 表示环境变量名。
注意  file path 或 value只能取一个。
 
3、filelist类型
filelist是一个支持命名的文件列表的数据类型,包含在一个filelist类型中的文件不一定是存在的文件。
 
以下是其所有的属性:
dir是用于计算绝对文件名的目录。
files 是用逗号分隔的文件名列表。
refid 是对某处定义的一个<filelist>的引用。
注意  dir 和 files 都是必要的,除非指定了refid(这种情况下,dir和files都不允许使用)。
 
4、fileset类型
fileset数据类型定义了一组文件,是一个文件的集合,并通常表示为<fileset>元素。不过,许多ant任务构建成了隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。
 
以下为fileset 的属性列表:
dir 表示fileset 的基目录。
casesensitive 的值如果为false,那么匹配文件名时,fileset不是区分大小写的,其默认值为true.
defaultexcludes 用来确定是否使用默认的排除模式,默认为true。
excludes 是用逗号分隔的需要派出的文件模式列表。
excludesfile 表示每行包含一个排除模式的文件的文件名。
includes 是用逗号分隔的,需要包含的文件模式列表。
includesfile 表示每行包括一个包含模式的文件名。
 
5、patternset类型
fileset是文件的集合,而patternset是对模式的集合,他们是紧密相关的概念。
 
<patternset>支持4个属性:
includes excludex includexfile 和 excludesfile,与fileset相同。
<patternset>还允许以下嵌套元素:include,exclude,includefile 和 excludesfile。
 
6、filterset类型
filterset定义了过滤器集合,这些过滤器将在文件移动或复制时完成文件的文本替换。
 
主要属性如下:
begintoken 表示嵌套过滤器所搜索的记号,这是标识其开始的字符串。
endtoken 表示嵌套过滤器所搜索的记号这是标识其结束的字符串。
id 是过滤器的唯一标志符。
refid 是对构建文件中某处定义一个过滤器的引用。
 
7、path类型
path元素用来表示一个类路径,不过它还可以用于表示其他的路径。在用作这个属性时,路经中的各项用分号或冒号隔开。在构建的时候,此分隔符将代替当前平台中所有的路径分隔符。
 
path拥有的属性如下:
location 表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。
refid 是对当前构建文件中某处定义的一个path的引用。
path 表示一个文件或路径名列表。
 
8、path与classpath类型
参看第三部分中的介绍。
 
<classpath id="project.class.path">
    <pathelement path="${classpath}"/>
    <fileset dir="lib">
        <include name="**/*.jar"/>
    </fileset>
    <pathelement location="classes"/>
    <dirset dir="build">
        <include name="apps/**/classes"/>
        <exclude name="apps/**/*Test*"/>
    </dirset>
    <filelist refid="third-party_jars"/>
</classpath>
 
<path id="classpath">
 <pathelement location="${classes}"/>
 <fileset dir="${lib}" includes="**/*.jar"/>
 <fileset dir="${devlib}" includes="**/*.jar"/>
</path>
 
9、mapper类型
mapper类型定义了一组输入文件和一组输出文件间的关系。
 
其属性如下。
classname 表示实现mapper类的类名。当内置mapper不满足要求时,用于创建定制mapper.
classpath 表示查找一个定制mapper时所用的类型路径。
classpathref 是对某处定义的一个类路径的引用。
from 属性的含义取决于所用的mapper.
to 属性的含义取决于所用的mapper.
type 属性的取值为identity,flatten glob merge  regexp  其中之一,它定义了要是用的内置mapper的类型。
 
10、echo
该任务的作用是根据日志或监控器的级别输出信息。
它包括message、file、append和level四个属性,


参考:java爱好者文档, http://www.javafan.net

http://lavasoft.blog.51cto.com/62575/87306

原创粉丝点击