三、利用ant 构建和部署Java项目

    Ant 可以代替使用 javac java jar 等命令来执行 java 操作,从而达到轻松的构建和部署 Java 项目的目的。

1. 利用ant javac命令来编译Java程序

    Ant javac命令用于实现编译Java 程序的功能。下面来看一个简单的例子:首先我们建立名为 JavaTestProJava项目,建立src目录为源代码目录,在src目录下建立HelloWorld.java这个类文件。该类文件的内容如下:

 
  1. public class HelloWorld { 
  2.  
  3.      public static void main(String[] args) { 
  4.  
  5.     System.out.println("hello world!"); 
  6.  
  7.      } 
  8.  

    同时在JavaTestPro项目的根目录下建立build.xml 文件,在该文件中编译sr 目录下的Java文件,并将编译后的class文件放入build/classes 目录中,整个项目的目录结构如下:

 
  1. |JavaTestPro 
  2.  
  3.       |src 
  4.  
  5.       |build 
  6.  
  7.             |classes 
  8.  
  9.       |build.xml 

     在编译前,需清除classes 目录,该文件的内容如下:

 
  1. <?xml version="1.0" ?> 
  2.  
  3.   
  4.  
  5. <project name ="javacTest" default="compile" basedir="."> 
  6.  
  7.     <target name="clean"> 
  8.  
  9.         <delete dir="${basedir}/build"/> 
  10.  
  11.     </target> 
  12.  
  13.     <target name="compile"  depends ="clean"> 
  14.  
  15.         <mkdir dir ="${basedir}/build/classes"/> 
  16.  
  17.         <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/> 
  18.  
  19.     </target> 
  20.  
  21. </project> 

    在项目根目录(C:\ThinkInJavaCode\JavaTestPro)执行ant命令后,可在该目录下发现新生成的build/classes子目录,编译后生成的HelloWorld.class文件就在该目录下。

2. 使用java命令执行Java程序

    Ant 中可以使用 java命令实现运行Java程序的功能。可以在上面的build.xml基础上做修改来实现:

 
  1. <?xml version="1.0" ?> 
  2.  
  3. <project name ="javacTest" default="run" basedir="."> 
  4.  
  5.     <target name="clean"> 
  6.  
  7.         <delete dir="${basedir}/build"/> 
  8.  
  9.     </target> 
  10.  
  11.     <target name="compile"  depends ="clean"> 
  12.  
  13.         <mkdir dir ="${basedir}/build/classes"/> 
  14.  
  15.         <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/> 
  16.  
  17.     </target> 
  18.  
  19.      <target name="run"  depends ="compile"> 
  20.  
  21.         <java classname ="HelloWorld"> 
  22.  
  23.             <classpath> 
  24.  
  25.                <pathelement path="${basedir}/build/classes"/> 
  26.  
  27.             </classpath> 
  28.  
  29.         </java> 
  30.  
  31.     </target> 
  32.  
  33. </project> 

接着,就可以在控制台看见输出:"[java] hello world!"

3. 使用jar命令生成jar文件

    还可以在上例的基础上更进一步,来生成jar包,可在run 这个 target 下再加上如下 target

 
  1. <?xml version="1.0" ?> 
  2.  
  3. <project name ="javacTest" default="jar" basedir="."> 
  4.  
  5.     <target name="clean"> 
  6.  
  7.         <delete dir="${basedir}/build"/> 
  8.  
  9.     </target> 
  10.  
  11.     <target name="compile"  depends ="clean"> 
  12.  
  13.         <mkdir dir ="${basedir}/build/classes"/> 
  14.  
  15.         <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/> 
  16.  
  17.     </target> 
  18.  
  19.     <target name="run"  depends="compile"> 
  20.  
  21.           <java classname ="HelloWorld"> 
  22.  
  23.     <classpath> 
  24.  
  25.                     <pathelement path="${basedir}/build/classes"/> 
  26.  
  27.                  </classpath> 
  28.  
  29.            </java> 
  30.  
  31.     </target> 
  32.  
  33.     <target name="jar" depends="run"> 
  34.  
  35.            <jar destfile="helloworld.jar" basedir="${basedir}/build/classes"> 
  36.  
  37.                 <manifest> 
  38.  
  39.         <attribute name="Main-class" value="HelloWorld"/> 
  40.  
  41.                 </manifest> 
  42.  
  43.             </jar> 
  44.  
  45.     </target > 
  46.  
  47. </project> 

其中,projectdefault 属性设置为应设为jarant运行完毕后,可看到在项目的根目录下生成了一个 helloworld.jarjar包 。可通过运行以下命令来执行该jar包:

 
  1. java -jar helloworld.jar 

4. 使用war命令打包JavaEE项目

    建立一个JavaEE项目,其中src Java源代码目录,WebContent为各jsp存放目录,lib 为项目引用的的包的目录。在WebTest项目目录下建立了build.xml 文件,该文件为该工程的 Ant 构件文件。

 

 
  1. |WebContent 
  2.  
  3.     |src 
  4.  
  5.     |build 
  6.  
  7.         |classes 
  8.  
  9.     |WebContent 
  10.  
  11.         |META-INF 
  12.  
  13.             |MANIFEST.MF 
  14.  
  15.         |WEB-INF 
  16.  
  17.             |lib 
  18.  
  19.             |classes 
  20.  
  21.         |HelloJSP.jsp 
  22.  
  23.     |build.xml 

    读者可以 src 目录下放入在前续例子中开发的 HelloWorld.java 文件,并在 WebContent下建立 HelloJSP.jsp 文件,其内容很简单,就是输出 Hello 信息,代码如下所示:

 
  1. <%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> 
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
  4.  
  5. <html> 
  6.  
  7. <head> 
  8.  
  9. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  10.  
  11. <title>war test for ant</title> 
  12.  
  13. </head> 
  14.  
  15. <body> 
  16.  
  17.       Hello JSP!Hello Ant! 
  18.  
  19. </body> 
  20.  
  21. </html> 

接下来编写 build.xml 文件,其内容如下:

 
  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2.  
  3. <project name ="WebTest" default ="war" basedir ="."> 
  4.  
  5.     <property  name ="classes" value ="${basedir}/build/classes"/> 
  6.  
  7.     <property  name ="build" value ="${basedir}/build"/> 
  8.  
  9.     <property  name ="lib" value ="${basedir}/WebContent/WEB-INF/lib"/> 
  10.  
  11.      <!--  删除build 路径--> 
  12.  
  13.     <target  name ="clean"> 
  14.  
  15.         <delete dir ="${build}"/> 
  16.  
  17.     </target> 
  18.  
  19.   
  20.  
  21.      <!--  建立build/classes 路径,并编译class 文件到build/classes 路径下--> 
  22.  
  23.      <target name ="compile"  depends ="clean"> 
  24.  
  25.         <mkdir dir ="${classes}"/> 
  26.  
  27.         <javac srcdir ="${basedir}/src"  destdir ="${classes}"/> 
  28.  
  29.      </target> 
  30.  
  31.   
  32.  
  33.      <!--  打war 包--> 
  34.  
  35.      <target name ="war" depends ="compile"> 
  36.  
  37.             <war destfile ="${build}/WebTest.war"  webxml ="${basedir}/WebContent/WEB-INF/web.xml"> 
  38.  
  39.             <!--  拷贝WebRoot 下除了WEB-INF 和META-INF 的两个文件夹--> 
  40.  
  41.              <fileset dir ="${basedir}/WebContent"  includes ="**/*.jsp"/> 
  42.  
  43.             <!--  拷贝lib 目录下的jar 包--> 
  44.  
  45.             <lib dir ="${lib}"/> 
  46.  
  47.             <!--  拷贝build/classes 下的class 文件--> 
  48.  
  49.             <classes dir ="${classes}"/> 
  50.  
  51.         </war> 
  52.  
  53.      </target> 
  54.  
  55. </project> 

C:\ThinkInJavaCode\WebTest目录下运行ant后,就生成了WebTest.war 文件了,然后可以将其放入Web容器(Tomcat)的相应目录下(${Tomcata安装目录}\webapps)运行该web项目了。