`

ANT的安装与配置(收集来用的)

阅读更多

ANT的基本概念:Java的Makefile

当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java 中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。

每个ant脚本(缺省叫build.xml)中设置了一系列任务(target):比如对于一个一般的项目可能需要有以下任务。

  • 任务1:usage 打印本脚本的帮助信息(缺省)
  • 任务2:clean <-- init 清空初始化环境
  • 任务3:javadoc <-- build <-- init 生成JAVADOC
  • 任务4:jar <-- build <-- init 生成JAR
  • 任务5:all <-- jar + javadoc <-- build <-- init 完成以上所有任务:jar javadoc
而多个任务之间往往又包含了一定了依赖关系:比如把整个应用打包任务(jar)的这个依赖于编译任务(build),而编译任务又依赖于整个环境初始化任务(init)等。

注:我看到很多项目的ant脚本中的命名基本上都是一致的,比如:编译一般叫build或者compile;打包一般叫jar或war;生成文档一般命名为javadoc或javadocs;执行全部任务all。在每个任务的中,ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外部应用种类非常丰富,但其实最常用的就2,3个:比如javac javadoc jar等。

ANT的安装

解包后在系统可执行路径中加入指向ant的bin的路径就可以了,比如可以在GNU/Linux上把以下配置加入/etc/profile中:
export ANT_HOME=/home/ant
export JAVA_HOME=/usr/java/j2sdk1.4.1
export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin

这样执行ant 后,如果不指定配置文件ant会缺省找build.xml这个配置文件,并根据配置文件执行任务,缺省的任务设置可以指向最常用的任务,比如: build,或指向打印帮助信息:usage,告诉用户有那些脚本选项可以使用。

ANT的使用

最好的学习过程就是看懂那些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:
更多任务/扩展:(样例)
  • 测试任务:JUnit测试
  • 代码风格检查任务:CheckStyle,Jalopy等
  • 邮件警报任务:可以把以上这些任务的输出警告发送到制定的用户列表中,这个任务可以设置每天自动运行。


分享到:
评论

相关推荐

    网络上搜集的Findbugs在Ant下的配置方法

    **Findbugs在Ant下的配置方法** FindBugs是一款开源的静态代码分析工具,主要用于检测Java代码中的潜在错误、坏味道和安全漏洞。它通过分析字节码而非源代码,能够发现许多编译器无法捕获的问题。在Ant构建环境中...

    Junit+ant+cobertura示例

    总的来说,"Junit+ant+cobertura示例"是一个展示如何使用JUnit进行单元测试,通过Ant进行自动化构建,并利用Cobertura进行代码覆盖率分析的实践案例。这样的组合可以帮助开发者更高效地管理和提升代码质量,确保软件...

    ant介绍Ant是什么

    使用 Ant 的一大优势在于它的扩展性。除了内置任务,开发者可以通过实现 `Task` 接口创建自己的任务,这使得 Ant 能够处理几乎任何类型的构建需求。XML 配置文件的结构清晰,使得多人协作变得容易,也方便自动化工具...

    ant.jar,ant-junit.jar,ant-launcher.jar,ant-trax.jar

    例如,你可以使用ant.jar来编译源代码、创建类路径、打包JAR文件,甚至运行单元测试。这个库是使用Ant进行项目构建的基础,几乎所有的Ant任务都依赖于它。 2. ant-junit.jar:此文件扩展了Ant的功能,使其能够集成...

    收集的一些ant资料,跟大家分享

    在本文中,我们将深入探讨Ant的相关知识点,帮助你更好地理解和使用这个强大的工具。 一、Ant简介 Ant是一个开源的Java项目构建系统,它通过XML配置文件定义了一系列的构建任务,如编译源代码、打包、测试、部署等...

    Junit+Jacoco+ant集成使用

    提供的压缩包文件“JacocoAnt”可能包含了示例的Ant配置文件或示例项目,用于演示如何集成JUnit和JaCoCo。解压后,你可以查看其中的文件,了解具体配置和使用方法。通过运行Ant任务,你将能实际运行测试并生成覆盖...

    clover-ant-2.4.2 版本安装包

    6. **示例**:可能包含如何配置和使用Clover Ant的示例配置文件和脚本。 安装Clover Ant通常涉及以下步骤: 1. 解压clover-ant-2.4.2.zip到一个合适的目录。 2. 将clover.jar和clover-agent.jar添加到Ant的类路径...

    CruiseControl及ant配置

    ### CruiseControl及Ant配置知识点详解 #### 一、CruiseControl简介 **CruiseControl**是一种持续集成(Continuous Integration, CI)工具,主要用于自动化软件构建过程。它支持多种构建工具和版本控制系统,能够...

    Ant使用指南

    #### 四、Ant的安装与配置 ##### **4.1 安装Ant** - **下载**: 访问Apache官方网站下载最新版本的Ant安装包。 - **解压**: 将安装包解压到期望的位置。 - **环境变量**: 设置`ANT_HOME`环境变量指向Ant的安装...

    apache-ant-1.9.13

    安装这个版本后,可以通过阅读官方文档或使用`ant -help`命令来了解如何配置和使用。 总的来说,Apache Ant 在软件开发流程中扮演着关键角色,尤其是与JMeter结合时,它可以帮助团队更有效地进行性能测试的自动化,...

    10_ant_基于j2se的综合实战项目_01

    首先,我们要了解Ant的安装和配置。通常,Ant的bin目录需要添加到系统的PATH环境变量中,以便在命令行中直接调用ant命令。在Windows系统中,这可以通过编辑系统属性来完成。 然后,我们来看看build.xml文件的结构。...

    ant集成jacoco生成代码覆盖率报表

    标题中的“ant集成jacoco生成代码覆盖率报表”指的是在Java开发中,使用Apache Ant构建工具与JaCoCo代码覆盖率库相结合,来生成项目代码的覆盖率报告。JaCoCo是一款广泛使用的开源代码覆盖率工具,它提供了方便的...

    ant自动发布工程

    - **测试(Test)**: 使用`&lt;junit&gt;`任务运行JUnit测试,可配置测试类或方法,收集测试报告。 4. **自动发布流程** - **部署准备(Deploy Preparation)**: 包括打包后的验证、签名,以及生成版本信息等。 - **...

    JMETER-3.1+ant

    4. **JMeter与Ant集成**:可以在Ant的`build.xml`文件中配置目标,调用JMeter的命令行工具`jmeter.bat`或`jmeter.sh`来执行性能测试,收集并分析结果。 5. **持续集成**:Ant常与其他工具如Jenkins、Maven一起使用...

    Java调用Ant API用法收集

    提供的两个文件名"OReilly.Essential.CVS.2nd.Edition.Nov.2006.chm"和"CVS.pdf"看起来与版本控制系统CVS相关,可能作为补充阅读材料,介绍如何结合CVS与Ant进行源代码管理。 总之,Java调用Ant API允许开发者在...

    teamcity-ant脚本.rar

    TeamCity还提供了许多高级特性,如分布式构建、VCS根的配置、构建缓存等,这些都可以与Ant脚本结合使用,进一步提升构建效率和灵活性。 通过TeamCity和Ant的集成,开发团队可以实现高效的自动化构建和部署流程,...

    Apache Ant 使用指南

    1. **安装与配置**:下载Apache Ant并添加到系统路径,配置`ANT_HOME`环境变量。 2. **创建构建文件**:根据项目需求编写`build.xml`,定义目标和任务。 3. **运行Ant**:在命令行中,使用`ant`命令执行构建文件中...

    Ant实战(第2版)

    在Ant的配置文件中,可以指定使用特定的脚本语言来编写脚本任务,并实现更加复杂的构建逻辑。 对于开发者来说,Ant不仅是一个构建工具,更是一个可以提高工作效率的工具。通过Ant,开发者可以快速地在不同的环境...

Global site tag (gtag.js) - Google Analytics