`

用Ant构建Java项目

 
阅读更多


Ant是一个开放源代码的构建工具,专门用于构建Java项目。

Ant入门的最容易的方法就是编写一个构建文件------build.xml。当Ant运行时,会在当前目录下寻找名为build.xml的文件。

编写Ant构建文件:

第一步:定义项目(project)

在项目根目录下创建build.xml文件。第一行指明其为XML格式,然后在第二行定义项目。

<?xml version="1.0"?>

<project name="dms" default="compile" basedir=".">

一个Ant构建文件定义一个项目,使用<project>元素的name属性命名项目,将default属性设为compile,告诉Ant当你在命令行键入ant而无其他参数时,将执行构建过程的compile步骤。我们稍候将定义此步骤;将basedir属性设为".",告诉Ant,该构建文件内的全部其他路径都是相对于build.xml文件所在路径而言的。

第二步:定义性质(property)

下一步,为项目的每一个目录定义性质,以便让Ant了解项目的目录结构。

  <property name="build.dir"      location="build"/>

  <property name="build.prod.dir" location="${build.dir}/prod"/>

  <property name="build.test.dir" location="${build.dir}/test"/>

  <property name="doc.dir"        location="doc"/>

  <property name="index.dir"      location="index"/>

  <property name="src.dir"        location="src"/>

  <property name="test.dir"       location="test"/>

  <property name="vendor.lib.dir" location="vendor/lib"/>

location属性所指的目录相对于<project>元素定义的basedir属性值(基目录)。

使用Ant性质命名相对目录有两个优点。首先,当Ant运行构建文件时,会定位build.xml文件所在目录的全部相对目录。第二个好处是,性质可以使构建文件易于维护。例如用build.dir性质指代build目录,当以后决定更改build目录为classes时,只要修改build.dir性质的location属性值即可。在构建文件中所有引用build.dir性质的地方,都将会自动指向新的classes目录。

第三步:定义路径(path)

下面定义表示项目Java类路径的路径。

  <path id="project.classpath">

    <pathelement location="${build.prod.dir}" />

    <pathelement location="${build.test.dir}" />

    <fileset dir="${vendor.lib.dir}">

      <include name="*.jar"/>

    </fileset>

  </path>

<path>元素创建路径project.classpath。我们将在构建过程的编译步骤用到此路径。

首先,用<pathelement>元素向路径加入两个构建目录,以便Java编译器可以找到所有的类文件,然后使用<fileset>元素,加入所有厂家.jar文件至此路径,使Java编译器可以找到我们用到的厂家类。

第四步:定义目标(target)

接着我们定义首个构建步骤------称为“目标”。该目标创建编译步骤将要存放Java类文件的目录。

  <target name="prepare">

    <mkdir dir="${build.prod.dir}"/>

    <mkdir dir="${build.test.dir}"/>

  </target>

目标只是定义了一系列任务按照指定的顺序执行的有名字的构建步骤。prepare目标使用<mkdir>任务创建构建输出目录,这与在命令行上执行mkdir是等效的。但前者可以工作于任何操作系统下,不会因为目录已经存在而失败,而且必要时会创建父目录。

第五步:定义编译步骤

终于我们可以定义编译步骤了。他将编译所有的产品源文件,将结果类文件放到prepare目标所生成的目录下。

  <target name="compile" depends="prepare">

    <javac srcdir="${src.dir}" destdir="${build.prod.dir}">

      <classpath refid="project.classpath" />

    </javac>

  </target>

通过目标的depends属性,可以生成目标间的依存关系,从而指定目标顺序。该属性值是一个目标名间用逗号隔开的清单。

例如,compile目标使用depends属性来声明与prepare目标的依存关系,这意味着要运行compile目标必须首先运行prepare目标,以在编译源文件前生成要求的目录。与shell脚本或批处理文件总是顺序执行命令相比,这是一个很大的优点。

prepare目标运行后,compile目标运行<javac>任务,从而调用Java编译器。编译器处理src.dir性质所指目录下的全部Java源文件,在build.prod.dir性质所指目录下生成对应的类文件。

<classpath>元素告诉编译器使用project.classpath代表的值作为类路径。

下面是完整的构建文件:

 <? xml version="1.0" ?>

 <!--

  Excerpted from the book, "Pragmatic Project Automation"

  ISBN 0-9745140-3-9

  Copyright 2004 The Pragmatic Programmers, LLC.  All Rights Reserved.

  Visit www.PragmaticProgrammer.com

  -->

 < project  name ="dms"  default ="compile"  basedir ="." >

  

   < property  name ="build.dir"       location ="build" />

   < property  name ="build.prod.dir"  location ="${build.dir}/prod" />

   < property  name ="build.test.dir"  location ="${build.dir}/test" />

   < property  name ="doc.dir"         location ="doc" />

   < property  name ="index.dir"       location ="index" />

   < property  name ="src.dir"         location ="src" />

   < property  name ="test.dir"        location ="test" />

   < property  name ="vendor.lib.dir"  location ="vendor/lib" />

   < path  id ="project.classpath" >

     < pathelement  location ="${build.prod.dir}"   />

     < pathelement  location ="${build.test.dir}"   />

     < fileset  dir ="${vendor.lib.dir}" >

       < include  name ="*.jar" />

     </ fileset >

   </ path >     

   < target  name ="prepare" >

     < mkdir  dir ="${build.prod.dir}" />

     < mkdir  dir ="${build.test.dir}" />

   </ target >

   < target  name ="compile"  depends ="prepare" >

     < javac  srcdir ="${src.dir}"  destdir ="${build.prod.dir}" >

       < classpath  refid ="project.classpath"   />

     </ javac >

   </ target >

 </ project >

运行构建:

在命令行环境中,切换至build.xml所在的目录,运行Ant:

D:\MyProject> ant

运行Ant前,请确认ANT_HOME环境变量指向你的Ant安装目录,且PATH环境变量中加入了%ANT_HOME%\bin。

Ant读取build.xml,以预先定义的顺序执行构建步骤(目标)。

--------------------------------------------------------------------续------------------------------

这一篇讲述如何自动运行JUnit测试进行自动化测试。我们将JUnit测试放在test目录。

第一步:编译测试

首先,在build.xml文件里定义一个单独的构建目标,以便编译测试源文件。

  <target name="compile-tests" depends="compile">

    <javac srcdir="${test.dir}" destdir="${build.test.dir}">

      <classpath refid="project.classpath" />

    </javac>

  </target>

compile-tests目标用<javac>任务在test.dir目录编译测试源文件,并将结果类文件放入build.test.dir目录,用project.classpath路径作为测试代码的类路径。

第二步:运行测试

在build.xml文件里定义构建目标,使所有的JUnit测试自动运行。

  <target name="test" depends="compile-tests">

    <junit haltonfailure="true">

      <classpath refid="project.classpath" />

      <formatter type="brief" usefile="false" />

      <batchtest>

        <fileset dir="${build.test.dir}"

          includes="**/*Test.class" />

      </batchtest>

      <sysproperty key="doc.dir"   value="${doc.dir}" />

      <sysproperty key="index.dir" value="${index.dir}" />

    </junit>

  </target>

test目标的depends属性生成与刚定义的compile-tests目标的依存关系。

如果构建成功,意味着所有的东西不仅都编译过,还都通过了测试。

将haltonfailure属性设为true会使构建随着任何测试失败而失败。

这里我们再次用project.classpath定义了运行JUnit测试的类路径。

下面定义了一个输出格式化器,在<formatter> 元素中,使用brief类型来输出每个运行的测试用例的名称及其统计信息,仅当测试失败时才有更详细的信息(plain类型默认比brief类型输出信息多一些;xml类型将测试结果以XML格式输出)。将usefile属性值设为false会将测试结果送往控制台,而不是写入文件。

<batchtest>任务收集从封闭<fileset>元素中返回的所有测试,并自动创建包含了所有测试的测试suite。我们将对所有的测试类用*Test.java命名约定取名,这些文件将编译成*Test.class文件,放在<fileset>的build.test.dir性质指向的目录中。

最后,<sysproperty>元素定义系统性质为一个键值对,这些性质可以在测试代码中访问。这里,测试需要知道从哪里找到文档,以及向哪里放入文档的索引结果,在运行测试时我们将传递这些结果,例如,测试在运行时查看送入的doc.dir系统性质来定位项目目录结构中doc目录的绝对路径。

要运行测试,请执行test目标:

$ ant test

最后,打扫战场

我们可以定义一个删除所有构建输出的Ant目标。

  <target name="clean">

    <delete dir="${build.dir}" />

  </target>

clean目标使用<delete>任务来删除build.dir所指的目录。要删除目录,请运行clean目标:

$ ant clean

冲掉这些构建输出有积极的作用:从头开始生成构建,可以发现可能被累积构建掩盖的错误。

完整的build.xml:

<?xml version="1.0"?>

<!--

  Excerpted from the book, "Pragmatic Project Automation"

  ISBN 0-9745140-3-9

  Copyright 2004 The Pragmatic Programmers, LLC.  All Rights Reserved.

  Visit www.PragmaticProgrammer.com

 -->

<project name="dms" default="compile" basedir=".">

  

  <property name="build.dir"      location="build"/>

  <property name="build.prod.dir" location="${build.dir}/prod"/>

  <property name="build.test.dir" location="${build.dir}/test"/>

  <property name="doc.dir"        location="doc"/>

  <property name="index.dir"      location="index"/>

  <property name="src.dir"        location="src"/>

  <property name="test.dir"       location="test"/>

  <property name="vendor.lib.dir" location="vendor/lib"/>

  <path id="project.classpath">

    <pathelement location="${build.prod.dir}" />

    <pathelement location="${build.test.dir}" />

    <fileset dir="${vendor.lib.dir}">

      <include name="*.jar"/>

    </fileset>

  </path>    

  <target name="prepare">

    <mkdir dir="${build.prod.dir}"/>

    <mkdir dir="${build.test.dir}"/>

  </target>

  <target name="compile" depends="prepare">

    <javac srcdir="${src.dir}" destdir="${build.prod.dir}">

      <classpath refid="project.classpath" />

    </javac>

  </target>

  <target name="compile-tests" depends="compile">

    <javac srcdir="${test.dir}" destdir="${build.test.dir}">

      <classpath refid="project.classpath" />

    </javac>

  </target>

  <target name="test" depends="compile-tests">

    <junit haltonfailure="true">

      <classpath refid="project.classpath" />

      <formatter type="brief" usefile="false" />

      <batchtest>

        <fileset dir="${build.test.dir}" 

          includes="**/*Test.class" />

      </batchtest>

      <sysproperty key="doc.dir"   value="${doc.dir}" />

      <sysproperty key="index.dir" value="${index.dir}" />

    </junit>

  </target>

  <target name="clean">

    <delete dir="${build.dir}" />

  </target>

  

</project>

下面再举一个实际项目中用到的构建文件的例子:

<?xml version="1.0" ?>

<project name="JSBook" default="compile" basedir=".">

  <property environment="env" />

  <property name="src" value="WEB-INF/src" />

  <property name="classes" value="WEB-INF/classes" />

  <property name="lib" value="WEB-INF/lib" /> 

  <property name="dist" value="dist" />

  

  <path id="task.classpath">

    <pathelement location="${classes}" />

    <pathelement location="${lib}" /> 

    <!-- Tomcat 5.0.16 Servlet 2.4 API -->

    <pathelement location="${lib}/servlet-api.jar" />

    <!-- Tomcat 5.0.16 JSP 2.0 API -->

    <pathelement location="${lib}/jsp-api.jar" />

  </path>

    

  <target name="init" >

    <echo>Init Complete !</echo>

    <echo>ant home = ${ant.home} </echo>

    <echo>java home = ${java.home} </echo>

    <echo>user home = ${user.home} </echo>      

  </target>

  

  <target name="compile" depends="init" >

    <javac classpathref="task.classpath" srcdir="${src}" destdir="${classes}" />

    <echo level="verbose">Seen with -verbose</echo>

    <echo level="debug">Seen with -debug</echo>        

    <echo>Compilation Complete !</echo>

  </target>

  

  <target name="war" >

    <jar jarfile="${dist}/JSPBook.war" basedir="."/>

  </target>

</project>

分享到:
评论

相关推荐

    用Ant实现Java项目的自动构建和部署

    标题“用Ant实现Java项目的自动构建和部署”指的是利用Apache Ant工具来自动化Java应用程序的编译、打包和部署过程。Apache Ant是一个基于XML的构建工具,它允许开发者定义任务序列,以便在没有人类干预的情况下执行...

    ant编译java工程

    标题 "ant编译java工程" 涉及到的是使用Apache Ant工具来构建Java应用程序的过程。Apache Ant是一个基于XML的构建工具,它允许开发者通过声明式的方式定义项目构建任务,而不是采用程序化的方式。在Java开发中,Ant...

    使用Ant进行java开发

    Ant(Another Neat Tool)是一个广泛用于Java项目管理的构建工具,尤其适用于那些需要执行诸如编译、测试、打包和部署等任务的项目。Ant的优势在于其灵活性和易用性,它使用XML(可扩展标记语言)来描述构建过程,...

    ant 构建java web工程

    一个简单的java web 编译打包部署

    JAVA_Ant详细介绍与应用

    包含文档和项目实例。...利用Ant构建和部署Java工程 1.利用Ant的javac任务来编译java程序 2.使用Ant的java任务运行Java程序 3.使用Ant的jar任务生成jar文件 4.使用Ant的war任务打包J2EE Web项目 五.总结

    ant-javacard-master_antjava_Will_

    这可能意味着项目涉及到了Java Card平台上的Ant工具的自定义或扩展,以便更高效地管理和构建Java Card应用,而这种改进可能会影响成本效率。 Java Card技术的核心是它的卡片操作系统(COS),它支持Java Card应用的...

    Ant 项目构建教程

    Ant 是一个由 Apache 开发的 Java 项目构建工具,它简化了构建、编译、测试和部署Java应用程序的过程。Ant 是基于XML的,其核心文件是`build.xml`,它包含了构建过程的所有指令和配置。 **构建Ant环境** 在使用Ant...

    ANT构建的一个问题

    标题中的“ANT构建的一个问题”指的是在使用Apache Ant工具进行软件构建时遇到的特定问题。Apache Ant是一个Java库和命令行工具,其任务是驱动构建过程。它通过XML定义的构建文件来描述构建步骤,使得开发者可以自动...

    Ant构建Java项目之第1篇

    Ant可以代替使用javac、java和jar等命令来执行java操作,从而达到轻松的构建和部署Java工程的目的。下面来看几个知识点。  1.project元素  project元素是Ant构件文件的根元素,Ant构件文件至少应该包含一个...

    如何使用ANT开发Java程序

    本篇文章将详细介绍如何使用Ant进行Java程序的开发,涵盖安装配置、项目结构设计、编写构建脚本等多个方面。 #### 二、准备工作 1. **安装 Ant** 首先,你需要下载并安装 Ant。这里我们假设你已经将 Ant 解压到...

    基于 Ant 的 Java 项目示例.zip

    设置构建此项目需要 Ivy 可供 Ant 使用。您只需要在 Ant 的类路径(在您的$CLASSPATH、 $ANT_HOME/lib或 中~/.ant/lib)中安装 ivy.jar。依赖项您需要安装 Astyle 并将其置于路径中,以使“格式”目标正常工作。如果...

    Ant基于Java的构建工具.ppt

    Ant基于Java的构建工具.ppt

    ant 构建环境使用

    在标题“ant 构建环境使用”中,我们主要关注的是如何设置和使用Ant来管理Java项目的构建流程。Ant的核心是build.xml文件,这是一个包含了一系列任务(tasks)的XML文档,这些任务定义了构建过程中的各种操作,如...

    java项目ant打包脚本

    这个脚本会设置必要的环境变量,并调用Java来执行Ant的主类`org.apache.tools.ant.Main`,从而启动Ant构建过程。 4. **`build.xml`文件**: `build.xml`是Ant的主要配置文件,它定义了项目构建的规则和目标。文件...

    java ant-project

    在描述中提到的博文链接,虽然现在无法直接访问,但通常会包含使用Ant构建Java项目的实践示例、常见问题解答或者技巧分享。这些内容可能涵盖了如何配置Ant构建文件(build.xml)、如何定义任务和目标、如何处理依赖...

    Ant1.9.14 基于Java的生成工具

    使用Ant构建Java项目时,通常会经历以下几个步骤: 1. **创建build.xml文件**:这是Ant的主配置文件,需要定义项目的目标、任务和属性。 2. **定义属性**:在build.xml中设置项目相关的变量,如源代码目录、输出...

Global site tag (gtag.js) - Google Analytics