1. 使用Ant工具编译Java程序
Ant提供了javac核心任务,javac任务用于实现编译Java程序的功能。Ant工具提供了一个全局属性,用于指定使用的Java编译器;javac任务会使用指定的编译器对Java程序进行编译。默认时编译器为当前运行Ant工具的JDK。这个用于设定Java编译器的属性为build.compiler。
1.1 javac任务包含以下属性
- srcdir:用于指定Java源文件所在的目录。这个属性是必须的,除非直接引用<src>元素。
- destdir:指定一个目标位置用于存放编译后的class程序。
- includes:指定要包含的Java源文件,可使用逗号和空格符进行分隔。当忽略时代表包含所有Java文件。
- includesfile:用于指定要包含的文件的名称。
- excludes:用于指定将不被包含的Java源文件,可以使用逗号和空格符进行分隔。
- excludesfile:用于指定不需要进行编译的Java文件。
- classpath:用于指定类库的引用位置。
- sourcepath:用于指定源文件的路径,可直接引用<src>元素。
- bootclasspath:用于指定启动的class位置。
- classpathref:用于指定类库的位置,通过对已定义的<path>元素的引用来指定。
- sourcepathref:用于指定源文件的位置,通过对已定义的<path>元素的引用来指定。
- bootclasspathref:用于指定启动类文件的位置,也通过对已定义的<path>元素的引用来指定。
- extdirs:用于指定安装扩展的位置。
- encoding:用于指定Java文件的编码方式。
- nowarn:用于指定是否把-nowarn交换参数传递给Java编译器。默认为不传递。
- debug:用于设定编译源文件时是否输出调试信息。默认为off,代表把-g:none这个参数以命令行方式传递给编译器。
- debuglevel:用于指定编译时的调试级别。这个属性依赖于编译器,不常使用。
- optimize:用于指定编译Java源代码时是不是使用优化方式进行编译。默认为off,对源文件进行完全编译。
- deprecation:用于指定编译Java源文件时是否带deprecation信息。
- target:用于指定编译时的JVM的版本,默认时采用当前运行Ant的JVM的版本。要注意的是,如果使用JVM1.5进行编译,那么在JDK1.4或更早版本的Java环境时可能无法运行这些Java程序。
- verbose:指定编译Java源文件时使用-verbose参数,可以输出更详细的操作信息。
- depend:用于指定在编译Java程序时允许依赖跟踪(dependency-tracking)。这个属性只有jikes和classic编译器才起作用。
- includeJavaRuntime:用于设定是否把Java的运行库添加到classpath中。默认为false。
- includeAntRuntime:用于设定是否把Ant工具的运行库添加到classpath中默认为true。
- fork:用于指定是否在执行javac命令时使用外部Java编译器。默认为no,代表不使用外部编译器。
- executable:用于指定外部Java编译器的位置。当fork=yes时使用。
- memoryInitialSize:用于指定JVM初始化时占用的内存值,当指定了使用外部JVM进行构建时,可通过这个属性指定JVM的初始化内存。忽略时代表使用标准的JVM设置。
- memoryMaximumsize:用于指定JVM使用的最大内存值。当指定了外部JVM时,可以通过这个属性进行设定。忽略时,使用标准的JVM设置。
- failonerror:用于指定是否当出现编译错误时停止执行编译。默认为true,代表当出现错误时停止执行编译。
- source:用于指定在执行javac命令时是否使用-source命令行参数。默认为no,代表不使用。使用这个属性时请确认所使用的JVM支持-source这个参数。
- compiler:用于指定使用的编译器,可使用上面所说的编译器。默认时使用当前JVM作为编译器。
- listfiles:用于指定是否列出所有被编译的Java源文件。
- tempdir:用于指定临时文件的存放位置。
1.2 使用Ant工具编译Java程序实例
1.2.1 使用默认的编译器编译Java程序
<javac srcdir="${src}"
destdir="${build}"
classpath="spring.jar"
debug="on"
source="1.5"
/>
作用:编译${src}下的所有Java文件。编译后的class文件保存在${build}下。在编译时使用当前目录下的spring.jar进行编译,并显示调试信息。这个例子使用JVM1.5进行编译。
1.2.2 通过src类型指定源文件,并制定要编译的Java源文件
<javac destdir="${build}" classpath="abc.jar" debug="on">
<src path="$src}/>
<src path="$src2}/>
<include name="mypackage/p1/**"/>
<include name="mypackage/p2/**"/>
<exclude name="mypackage/p1/testpackage/**"/>
</javac>
作用:编译${src}和${src2}指定的源文件,包括package名为mypackage.p1开头或mypackage.p2开头的Java源文件,但是不包括mypackage.p1.testpackage开头的源文件。
1.2.3 使用外部编译器编译Java源文件
<javac srcdir="${src}"
destdir="${build}"
fork="yes"
executable="c:/java/jdk1.1/bin/javac"
compiler="javac1.1"
/>
使用外部Java编译器来编译Java程序,通过executable指定javac程序的位置。这里使用JVM1.1进行编译编译。
2. 使用Ant工具运行Java程序
Ant提供了Java这个核心任务用于实现执行Java程序的功能。
2.1 Java任务包含的属性
- classname:用于指定要执行的Java类。
- jar:用于指定要执行的jar文件的位置。这个jar文件一定要包含manifest目录和Main-Class实体。值得注意的时,如果这个属性被指定,那么fork属性必须设定为true。jar和classname这两个属性中的其一必须被指定。
- args:用于指定类执行时的参数。已不建议使用,可使用arg类型来代替。
- classpath:用于指定执行Java程序的引用类路径。
- classpathref:用于指定类库的引用。允许引用path类型定义的类库路径。
- fork:用于指定是否允许Java程序在另外的Java虚拟机上运行,而不是用当前运行Ant的JVM。
- outlive:用于指定是否允许打开一个进程并在Ant工具外运行。使用这个属性时需要设定fork属性为true。这个属性不兼容timeout、input、output、error和result属性。
- jvm:用于指定一个命令,然后调用Java虚拟机执行这个命令。这个命令将会通过java.lang.Runtime.exec()方法执行。默认时执行java命令。
- jvmargs:用于设定Java虚拟机参数,供Java虚拟机调用。这个属性已不建议使用,可以使用jvmarg类型来定义。
- maxmemory:用于设定Ant工具所启动的Java虚拟机所占用内存的最大值。
- failonerror:用于指定当命令出错或退出时返回一个非0的值时是否停止执行构建进程。默认为false。
- resultproperty:用于指定一个已定义的属性,这个被指定的属性用于记录命令执行时的返回值。
- dir:用于调用Java虚拟机的目录。
- output:用于指定一个用于信息输出的文件。
- error:用于指定标准错误信息的输出目录。
- logError:用于设定是否把信息输出到Ant的日志文件中。
- appended:用于指定是否附加或覆盖output和error指定的文件。默认为false。
- outputproperty:用于指定一个已定义的属性,这个属性用于存储输出信息。
- errorproperty:用于指定一个已定义的属性,这个属性用于存储输出的错误信息。
- input:用于指定输入文件,作为命令执行时的标准输入使用。
- inputstring:用于指定一个输入字符串,作为执行命令的输入参数。
- newenvironment:用于指定当新的环境变量被指定时不再传递旧的环境变量。默认为false。
- timeout:用于指定一个命令的执行时间,如果在指定时间内构建进程没完成,则这个命令将会被终止。建议当fork属性为true时才使用这个属性。
2.2 使用Ant运行Java程序实例
2.2.1 运行编译后的Java程序实例
<java classname="test.Main">
<classpath>
<pathelement location="dist/test.jar"/>
<pathelement path="${java.class.path}"/>
</classpath>
</java>
作用:运行test.Main这个Java程序,在运行前已生成test.jar文件,其中test.Main是这个jar的main方法。${java.class.path}是test.Main依赖的类库。
3. 使用Ant生成和解压jar文件
jar文件可称为Java归档文件,对编译后的.class文件进行打包。它可放在classpath中直接引用,也可以直接运行jar文件(需要指定jar中的Main-Class)。Ant工具提供了jar和Unjar这两个任务,可以方便地实现生成和解压jar文件的功能。
3.1 使用jar任务打包jar文件
- destfile:用于定义将要生成的.jar文件的名称。这个属性是必须的。
- basedir:用于指定要打包的.class文件的位置。
- compress:用于设定是否对打包的文件进行压缩。默认为true,进行压缩。
- keepcompression:在Ant1.6版本后提供了这个属性用于指定来自ZipFileSet等归档文件的文件是否保存本身的压缩方式。默认为false。
- encoding:用于设定文件名的编码方式。默认为utf-8编码。
- filesonly:用于指定是否只保存文件。默认为false。
- includes:用于指定家人文件中要包含的文件。可以使用逗号或空格符进行分隔。
- includesfile:用于指定要包含的文件的匹配模式。
- excludes:用于指定那些文件在jar文件中将不被包含。
- excludesfile:用于指定jar文件中将不被包含的文件的匹配模式,用于文件过滤。
- defaultexcludes:用于设定是否不包含Ant工具默认不包含的目录和文件。可取值true或false,忽略时代表不包含。
- manifest:用于指定是否使用jar规范中的manifest文件。相当于在jar中生成META-INF/MANIFEST.MF文件。
- filesetmanifest:用于定义当在jar文件中存在多个Manifest时(在ZipFileSet中存在),如何生成新的manifest属性。可取值skip、merge或mergewithoutmain。skip代表忽略ZipFileSet中原有的manifest,取值merge代表合并所有的manifests;取值mergewithoutmain代表合并所有manifests但是不包含manifest Main函数的定义。
- update:用于定义当jar中的目标文件已存在时是否更新或覆盖目标文件。默认为false。
- whenempty:用于指定当没有找到符合打包jar文件的文件时的处理方式。可取值为fail、skip或create。取值fail代表Ant工具会提示出错不生成jar文件;取值skip代表不处理不生成jar文件;取值create代表生成一个空的jar文件。默认为skip。
- duplicate:用于定义文件名重复时的处理方式。取值可以时add、preserve或fail。取值add代表添加用后面的覆盖前面的;取值preserve代表不覆盖已存在的文件;取值fail代表操作失败。
- index:用于设定是否使用一个索引文件,用于记录jar里的文件结构。默认为false。
- manifestencoding:用于定义读取jar文件中的manifest的编码方式,前提是jar文件中定义了manifest。
在打包jar文件时需要用到manifest任务,用于定义jar的文件描述。
manifest任务包含以下属性:
- file:用于指定建立或更新manifest-file文件。
- mode:定义文件操作。可取值为update或replace。默认为replace。
- encoding:用于定义读取manifest时的编码方式。
另外,在manifest任务中还可以使用attribute和section类型
- attribute类型包含一个名称和值得对应关系
- section类型只有一个name属性,一个section可包含一个或多个attribute。
3.2 使用Ant工具打包jar文件实例
3.2.1 打包编译后的.class文件,并对文件进行过滤
<jar destfile="${dist}/lib/app.jar"
basedir="${build}/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
/>
3.2.2 通过FileSet定义需要打包的.class文件
<jar destfile="${dist}/lib/app.jar">
<fileset dir="${build}/classes"
excludes="**/Test.class"
/>
<fileset dir="${src}/resources"/>
</jar>
3.2.3 打包jar文件并生成manifest文件
<jar destfile="test.jar" basedir="${build}/classes">
<include name="mypackage/test/**/">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<section name="common/class1.class">
<attribute name="Sealed" value="false"/>
</section>
</manifest>
</jar>
运行上面的文件,生成的manifest文件内容如下:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.7
Created-By: 1.8.0_112-b15 (Oracle Corporation)
Built-By: fanxiaobin
Name: common/class1.class
Sealed: false
4. 使用Ant工具解压jar、war和ear文件
4.1 使用Ant工具解压归档文件的任务
- src:用于指定要解压的文件位置。这个属性是必需的,也可以通过FileSet指定。
- dest:用于定义解压后的文件存放位置。这个属性是必需的。
- overwrite:用于定义当目标位置的文件比归档文件中的文件新时,是否覆盖旧的文件。默认为true,代表覆盖。
- compression:只适用于untar命令时使用。可以取值none、gzip或bzip2.。默认为none。
- encoding:用于指定文件的编码方式,但这个属性不能用于untar命令。
另外,在unzip任务中还可以使用FileSet和PatternSet类型。
4.2 使用Ant工具解压归档文件
<?xml version="1.0"?>
<project name="unzip" default="unjar" basedir=".">
<property name="classpath" value="compile.jar"/>
<!-- unjar the file -->
<target name="unjar" >
<mkdir dir="unzip"/>
<unzip src="${classpath}" dest="unzip"/>
</target>
</project>
参考资料:
《Ant开发及整合应用详解》