当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java 中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。
而多个任务之间往往又包含了一定了依赖关系:比如把整个应用打包任务(jar)的这个依赖于编译任务(build),而编译任务又依赖于整个环境初始化任务(init)等。
注:我看到很多项目的ant脚本中的命名基本上都是一致的,比如:编译一般叫build或者compile;打包一般叫jar或war;生成文档一般命名为javadoc或javadocs;执行全部任务all。在每个任务的中,ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外部应用种类非常丰富,但其实最常用的就2,3个:比如javac javadoc jar等。
这样执行ant 后,如果不指定配置文件ant会缺省找build.xml这个配置文件,并根据配置文件执行任务,缺省的任务设置可以指向最常用的任务,比如: build,或指向打印帮助信息:usage,告诉用户有那些脚本选项可以使用。
最好的学习过程就是看懂那些open source项目中的build.xml脚本,然后根据自己的需要简化成一个更简单的,ANT和APACHE上很多非常工程派的项目:简单易用,而且适应性非常强,因为这些项目的建立往往来源于开发人员日常最直接的需求。
以下是的一个
WebLucene应用的例子:修改自
JDOM的build.xml:
<project default="usage" basedir=".">
<!-- =================================================================== -->
<!-- Initialization target -->
<!-- =================================================================== -->
<target name="init">
<tstamp/>
<property file="${basedir}/build.properties" />
<property name="Name" value="ProjectFullName"/>
<property name="name" value="project_name"/>
<property name="version" value="0.2"/>
<property name="year" value="2003"/>
<echo message="----------- ${Name} ${version} [${year}] ------------"/>
<property name="debug" value="off"/>
<property name="optimize" value="on"/>
<property name="deprecation" value="on"/>
<property name="src.dir" value="./src/WEB-INF/src"/>
<property name="lib.dir" value="./src/WEB-INF/lib"/>
<property name="packages" value="com.chedong.*,org.apache.lucene.*"/>
<property name="build.src" value="./src/WEB-INF/build"/>
<property name="build.dest" value="./src/WEB-INF/classes"/>
<property name="build.javadocs" value="./src/doc"/>
<path id="classpath">
<pathelement path="${jsdk_jar}"/>
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
<filter token="year" value="${year}"/>
<filter token="version" value="${version}"/>
<filter token="date" value="${TODAY}"/>
<filter token="log" value="true"/>
<filter token="verbose" value="true"/>
</target>
<!-- =================================================================== -->
<!-- Help on usage -->
<!-- =================================================================== -->
<target name="usage" depends="init">
<echo message="${Name} Build file"/>
<echo message="-------------------------------------------------------------"/>
<echo message=""/>
<echo message=" available targets are:"/>
<echo message=""/>
<echo message=" jar --> generates the ${name}.jar file"/>
<echo message=" build --> compiles the source code"/>
<echo message=" javadoc --> generates the API documentation"/>
<echo message=" clean --> cleans up the directory"/>
<echo message=""/>
<echo message=" Please rename build.properties.default to build.properties"/>
<echo message=" and edit build.properties to specify JSDK 2.3 classpath."/>
<echo message=""/>
<echo message=" See the comments inside the build.xml file for more details."/>
<echo message="-------------------------------------------------------------"/>
<echo message=""/>
<echo message=""/>
</target>
<!-- =================================================================== -->
<!-- Prepares the source code -->
<!-- =================================================================== -->
<target name="prepare-src" depends="init">
<!-- create directories -->
<mkdir dir="${build.src}"/>
<mkdir dir="${build.dest}"/>
<!-- copy src files -->
<copy todir="${build.src}">
<fileset dir="${src.dir}"/>
</copy>
</target>
<!-- =================================================================== -->
<!-- Compiles the source directory -->
<!-- =================================================================== -->
<target name="build" depends="prepare-src">
<javac srcdir="${build.src}"
destdir="${build.dest}"
debug="${debug}"
optimize="${optimize}">
<classpath refid="classpath"/>
</javac>
</target>
<!-- =================================================================== -->
<!-- Creates the class package -->
<!-- =================================================================== -->
<target name="jar" depends="build">
<jar jarfile="${lib.dir}/${name}.jar"
basedir="${build.dest}"
includes="**"/>
</target>
<!-- =================================================================== -->
<!-- Creates the API documentation -->
<!-- =================================================================== -->
<target name="javadoc" depends="build">
<mkdir dir="${build.javadocs}"/>
<javadoc packagenames="${packages}"
sourcepath="${build.src}"
destdir="${build.javadocs}"
author="true"
version="true"
use="true"
splitindex="true"
windowtitle="${Name} API"
doctitle="${Name}">
<classpath refid="classpath"/>
</javadoc>
</target>
<!-- =================================================================== -->
<!-- Clean targets -->
<!-- =================================================================== -->
<target name="clean" depends="init">
<delete dir="${build.src}"/>
<delete dir="${build.dest}/org"/>
<delete dir="${build.dest}/com"/>
<delete>
<fileset dir="${build.dest}" includes="**/*.class"/>
</delete>
</target>
</project>
<!-- End of file -->
缺省任务:usage 打印帮助文档,告诉有那些任务选项:可用的有build, jar, javadoc和clean.
初始化环境变量:init
所有任务都基于一些基本环境变量的设置初始化完成,是后续其他任务的基础,在环境初始化过程中,有2点比较可以方便设置:
1 除了使用却缺省的property设置了JAVA源路径和输出路径外,引用了一个外部的build.properties文件中的设置,
<property file="${basedir}/build.properties" />
这样大部分简单配置用户只要会看懂build.properties就可以了,毕竟XML比起key value的属性文件还是要可读性差一些。用build.properties也可以方便其他用户从编译的细节中解放出来。
2 CLASSPATH设置:使用了其中的:
<path id="classpath">
<pathelement path="${jsdk_jar}"/>
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
则相当于设置了:CLASSPATH=/path/to/resin/lib/jsdk23.jar; /path/to/project/lib/*.jar;
文件复制:prepare-src
创建临时SRC存放目录和输出目录。
<!-- =================================================================== -->
<!-- Prepares the source code -->
<!-- =================================================================== -->
<target name="prepare-src" depends="init">
<!-- create directories -->
<mkdir dir="${build.src}"/>
<mkdir dir="${build.dest}"/>
<!-- copy src files -->
<copy todir="${build.src}">
<fileset dir="${src.dir}"/>
</copy>
</target>
编译任务:build
编译时的CLASSPATH环境通过一下方式找到引用一个path对象
<classpath refid="classpath"/>
打包任务:jar
对应用打包生成项目所写名的.jar文件
<!-- =================================================================== -->
<!-- Creates the class package -->
<!-- =================================================================== -->
<target name="jar" depends="build">
<jar jarfile="${lib.dir}/${name}.jar"
basedir="${build.dest}"
includes="**"/>
</target>
生成JAVADOC文档任务: javadoc
<!-- =================================================================== -->
<!-- Creates the API documentation -->
<!-- =================================================================== -->
<target name="javadoc" depends="build">
<mkdir dir="${build.javadocs}"/>
<javadoc packagenames="${packages}"
sourcepath="${build.src}"
destdir="${build.javadocs}"
author="true"
version="true"
use="true"
splitindex="true"
windowtitle="${Name} API"
doctitle="${Name}">
<classpath refid="classpath"/>
</javadoc>
</target>
清空临时编译文件:clean
<!-- =================================================================== -->
<!-- Clean targets -->
<!-- =================================================================== -->
<target name="clean" depends="init">
<delete dir="${build.src}"/>
<delete dir="${build.dest}/org"/>
<delete dir="${build.dest}/com"/>
<delete>
<fileset dir="${build.dest}" includes="**/*.class"/>
</delete>
</target>
TODO:
更多任务/扩展:(样例)
相关推荐
**Findbugs在Ant下的配置方法** FindBugs是一款开源的静态代码分析工具,主要用于检测Java代码中的潜在错误、坏味道和安全漏洞。它通过分析字节码而非源代码,能够发现许多编译器无法捕获的问题。在Ant构建环境中...
总的来说,"Junit+ant+cobertura示例"是一个展示如何使用JUnit进行单元测试,通过Ant进行自动化构建,并利用Cobertura进行代码覆盖率分析的实践案例。这样的组合可以帮助开发者更高效地管理和提升代码质量,确保软件...
使用 Ant 的一大优势在于它的扩展性。除了内置任务,开发者可以通过实现 `Task` 接口创建自己的任务,这使得 Ant 能够处理几乎任何类型的构建需求。XML 配置文件的结构清晰,使得多人协作变得容易,也方便自动化工具...
例如,你可以使用ant.jar来编译源代码、创建类路径、打包JAR文件,甚至运行单元测试。这个库是使用Ant进行项目构建的基础,几乎所有的Ant任务都依赖于它。 2. ant-junit.jar:此文件扩展了Ant的功能,使其能够集成...
在本文中,我们将深入探讨Ant的相关知识点,帮助你更好地理解和使用这个强大的工具。 一、Ant简介 Ant是一个开源的Java项目构建系统,它通过XML配置文件定义了一系列的构建任务,如编译源代码、打包、测试、部署等...
提供的压缩包文件“JacocoAnt”可能包含了示例的Ant配置文件或示例项目,用于演示如何集成JUnit和JaCoCo。解压后,你可以查看其中的文件,了解具体配置和使用方法。通过运行Ant任务,你将能实际运行测试并生成覆盖...
6. **示例**:可能包含如何配置和使用Clover Ant的示例配置文件和脚本。 安装Clover Ant通常涉及以下步骤: 1. 解压clover-ant-2.4.2.zip到一个合适的目录。 2. 将clover.jar和clover-agent.jar添加到Ant的类路径...
### CruiseControl及Ant配置知识点详解 #### 一、CruiseControl简介 **CruiseControl**是一种持续集成(Continuous Integration, CI)工具,主要用于自动化软件构建过程。它支持多种构建工具和版本控制系统,能够...
#### 四、Ant的安装与配置 ##### **4.1 安装Ant** - **下载**: 访问Apache官方网站下载最新版本的Ant安装包。 - **解压**: 将安装包解压到期望的位置。 - **环境变量**: 设置`ANT_HOME`环境变量指向Ant的安装...
安装这个版本后,可以通过阅读官方文档或使用`ant -help`命令来了解如何配置和使用。 总的来说,Apache Ant 在软件开发流程中扮演着关键角色,尤其是与JMeter结合时,它可以帮助团队更有效地进行性能测试的自动化,...
首先,我们要了解Ant的安装和配置。通常,Ant的bin目录需要添加到系统的PATH环境变量中,以便在命令行中直接调用ant命令。在Windows系统中,这可以通过编辑系统属性来完成。 然后,我们来看看build.xml文件的结构。...
标题中的“ant集成jacoco生成代码覆盖率报表”指的是在Java开发中,使用Apache Ant构建工具与JaCoCo代码覆盖率库相结合,来生成项目代码的覆盖率报告。JaCoCo是一款广泛使用的开源代码覆盖率工具,它提供了方便的...
- **测试(Test)**: 使用`<junit>`任务运行JUnit测试,可配置测试类或方法,收集测试报告。 4. **自动发布流程** - **部署准备(Deploy Preparation)**: 包括打包后的验证、签名,以及生成版本信息等。 - **...
4. **JMeter与Ant集成**:可以在Ant的`build.xml`文件中配置目标,调用JMeter的命令行工具`jmeter.bat`或`jmeter.sh`来执行性能测试,收集并分析结果。 5. **持续集成**:Ant常与其他工具如Jenkins、Maven一起使用...
提供的两个文件名"OReilly.Essential.CVS.2nd.Edition.Nov.2006.chm"和"CVS.pdf"看起来与版本控制系统CVS相关,可能作为补充阅读材料,介绍如何结合CVS与Ant进行源代码管理。 总之,Java调用Ant API允许开发者在...
TeamCity还提供了许多高级特性,如分布式构建、VCS根的配置、构建缓存等,这些都可以与Ant脚本结合使用,进一步提升构建效率和灵活性。 通过TeamCity和Ant的集成,开发团队可以实现高效的自动化构建和部署流程,...
1. **安装与配置**:下载Apache Ant并添加到系统路径,配置`ANT_HOME`环境变量。 2. **创建构建文件**:根据项目需求编写`build.xml`,定义目标和任务。 3. **运行Ant**:在命令行中,使用`ant`命令执行构建文件中...
在Ant的配置文件中,可以指定使用特定的脚本语言来编写脚本任务,并实现更加复杂的构建逻辑。 对于开发者来说,Ant不仅是一个构建工具,更是一个可以提高工作效率的工具。通过Ant,开发者可以快速地在不同的环境...