您的位置:首页 > 其它

关于Ant脚本文件

2015-08-21 17:45 330 查看
Ant,全名Apache Ant,是构建Java项目要用到的工具。因为用Java语言编写,所以可以跨平台,在多个操作系统中运行。

好处是:合理的使用Ant可以大大降低项目构建、部署的难度!

构建Java项目是什么意思?什么叫构建项目?

构建就是对项目进行编译。

举例:HelloWorld这样的最简单的项目,只需要对HelloWorld这个 . Java 的源文件进行编译就可了!

但,如果是复杂的项目,就不仅仅是构建 . Java 的源文件了,项目中使用到的各种资源都需要合理的构建。

举例:有的类需要被压缩成jar归档文件、有的文件需要放到指定位置、有的时候会使用到配置文件。

//使用Ant脚本的理由

虽然,目前依靠MyEclipse及其插件可以方便的部署编译Java项目,但是,如果要部署的项目的目标机器上没有这种软件,或者,根本就不支持这种软件,这时,编译和部署就比较麻烦了。

//Ant可以做的事

不仅可以对Java源文件进行编译,还可以执行其他各种项目构建任务。如各种文件的位置之类。

使用Ant,需要编写一个构建配置文件。Ant会根据这个配置文件执行对应的操作。

如,指定部署配置过程中的各种动作,配置各种动作之间的依赖关系。

因此,只要在配置文件中,把项目构建的要求说明清楚,就可以使用Ant对项目进行构建、部署。

一、Ant也是需要安装配置的

      在Ant官方网站下载最新版本,无需安装,直接解压,再配置环境变量即可!

      (1) 新建用户变量,注意是用户变量,不是系统变量。

              ANT_HOME        C:\apache-ant-版本号 //
这个路径是Ant文件解压放置的路径

      (2)系统变量的Path变量中,添加,在前面添加:C:\apache-ant-版本号\bin;   

              //注意环境变量基本都  是反斜杠\

      (3)配置结束,检测是否安装成功。cmd-输入ant。若跳出Buildfile 。。。界面,说明安装配置成功了!

二、从HelloWorld开始讲起

  

      HelloWorld工程中,有一个src文件夹,用来放置工程中的源代码,该工程中只有一个HelloWorld.java 的   文件。

  

     没有使用Ant之前,让我们先用手工的方式对该工程进行构建。

   

     构建工程是什么意思呢?

     就是编译、打包、运行、部署等操作。HelloWorld没有部署这个步骤。

    构建HelloWorld工程需要以下几个步骤:

    1. 准备工作

        创建build/classes 目录,用来放置编译成功的类文件

        创建build/lib        目录,用来放置生成或是引用到的jar包(jar包还会生成?)

        此时,HelloWorld工程的根目录中有两个文件夹,src和build,build文件夹中又有classes和lib两个文件夹。

    2. 编译工程

       在没有使用辅助工具时,只有在DOS命令行中对Java文件进行编译。

       比如:HelloWorld的工程位置在C:\HelloWorld 。

       DOS命令行编译:

       把路径切换到工程目录,cd C:\   

                                                    cd HelloWorld

       调用javac编译源文件,javac-sourcepath src -d build\classes src\HelloWorld.java

                                     // -sourcepath src
指明在src文件夹中寻找要编译的Java文件

                                         -d                     指明把生成的class文件放在build/classes目录中

    3.生成jar文件

       在绝大部分的Java开源项目中,都会把类文件打包成jar文件,从而方便用户的使用。

       下面我们把HelloWorld这个工程中的类文件打包成jar文件。

       C:\>cd HelloWorld

       C:\HelloWorld>echoMain-Class:HelloWorld>Manifest  //生成一个Manifest文件,且指明Main-Class为HelloWorld

       C:\HelloWorld>md build\lib  //创建了一个目录,可以把生成的jar文件放在lib目录

       C:\HelloWorld>jar cfmbuild\lib\HelloWorld.jar Manifest -C build\classes,  //注意这一句的最后有个逗号, 根据清单文件,把class目录中的类文件打包成jar文件,并把生成的jar文件放在build\lib 目录下,生成的jar文件名为Hello World.jar

       在打包生成jar文件时,需要提供Manifest清单文件,在这个文件中可以配置Main-Class(这里是HelloWorld),

       即!包含有main方法的类,作为调用执行这个jar包的程序入口,

       在这个文件中同时可以配置引用到其他类库和包的信息。

     4.运行工程

        运行方法有两种供选择。

        第一种,直接执行编译得到的Java类。

        方法是:cd C:\

                    cd  HelloWorld

                    java -cp build\classes HelloWorld 
//意思是,在build\classes目录中,找到并执行HelloWorld这个类文件

                    Hello world!

          调用了java命令,其中参数cp的意思是指明在寻找HelloWorld类文件的路径位置。

         

        第二种,在DOS命令行中执行jar文件。

        方法是:cd C:\

                    cd  HelloWorld

                    java -jar build\lib\HelloWorld.jar

                    Hello world!

            这种方法,直接调用并执行jar包中的类文件,因为在上面生成HelloWorld.jar的过程中,我们已经在Manifest文件中指定了 HelloWorld为Main-Class,所以在执行这个jar包的时候,会自动找到HelloWorld这个类,并执行。

到这里,我们完成了HelloWorld这个工程的构建和运行的所有任务,可以感觉到,这个过程是相当麻烦的,这只是一个简单的HelloWorld,如果是复杂的工程,将更加麻烦,会有更大的工作量。

所以,我们有必要寻找一种简单灵活易用的构建工程的工具,接下来,我们使用Ant来完成这个任务。

(现在回想一下,如果使用Eclipse来编写编译Java工程,以上建立的一些文件夹和文件,都帮我们自动在工程根目录创建了,结果的显示也很方便的能够查看,这就是构建工具的方便性,现在体验一下Ant脚本是怎么用的)

三、使用Ant分步构建HelloWorld工程

       Ant在构建工程的时候,只需要一个简单的脚本,在这个脚本中,

       我们描述构建任务,然后就可以根据这个构建描述文件,完成构建工程的任务。

      

       在Ant中,这个文件默认名称为build.xml

       对HelloWorld这个工程来说,描述文件书写如下:

       //Ant 脚本是用XML描述的,这行代码是所有XML文档都必须指明的头信息。指定XML的版本,以及这个XML文档的字符编码格式

       <?xml version="1.0"encoding="UTF-8"?>

       //在Ant脚本中,必须包含project节点,这个节点是整个XML文档的根节点,

          name是工程的名称,default代表默认要做的事,basedir是工作的根目录,“.”代表是当前目录

       <project name="HelloWorld"default="run" basedir=".">

              //定义了一个名为src的属性,这个属性的值是src,在整个XML文档中,都可以使用${src}
的形式来调用这个属性的值

             //在Ant中,property相当于定义了一个变量
             <property name="src" value="src"/>

             <property name="dest" value="build/classes"/>

             <property name="lib" value="build/lib"/>

             <property name="hello_jar"value="build/lib/hello.jar">

              //定义了任务,任务的名称是init,要处理的内容是创建一个目录,目录的值为属性dest的值,也就是建立一个目录,build/classes

             <target name="init">

                    <mkdir dir="${dest}"/>

                    <mkdir dir="${lib}"/>

              </target>

              <target name="compile">

                     <javac srcdir="${src}" destdir="${dest}"/>

              </target>

              <target name="build">

                     <jar destfile="${hello_jar}" basedir="${dest}">

                             <manifest>

                                   <attribute name="Main-Class" value="HelloWorld">

                              </manifest>

                     </jar>

                </target>

                 <target name="run">

                        <java classname="HelloWorld" classpath="${hello_jar}"/>

                 </target>

                 <target name="clean">

                        <delete file="${hello_jar}"/>

                        <delete dir="${dest}"/>

                        <delete dir="${lib}">

                   </target>

          </project>

 

      在一个脚本中,可以有多个target,在Ant中可以根据名称执行对应的任务。

      在HelloWorld这个Ant构建脚本中,定义了5个构建任务,

      init的动作是执行工程

      compile的动作是编译

      build的动作是生成jar文件

      run的动作是执行工程

      clean的动作是清除构建动作生成的文件及目录

      这些动作都可以根据名称调用

把上面这个build.xml脚本文件放在HelloWorld的工程根目录下,就可以使用这个Ant脚本来构建HelloWorld这个工程,这个时候HelloWorld的工程目录结构就是一个src文件夹,一个build.xml的脚本文件

写完Ant脚本,开始构建的步骤如下:

1. 提前创建需要用到的文件夹和目录,init的target完成的就是这个任务

    所以在ant中调用这个任务即可

 

    C:\HelloWorld>ant init

    Buildfile:build.xml

    init:

    [mkdir] Created dir:   C:\HelloWorld\build\classes

    [mkdir] Created dir:   C:\HelloWorld\build\lib

   BUILD SUCCESSFUL

  

   只需要把当前路径切换到HelloWorld的工程目录下,然后输入 ant init 就可了!

   这样就完成了构建项目的准备工作。

2. 编译工程

    C:\HelloWorld>ant compile

    Ant会把指定目录中的源文件全部编译,并把编译得到的类文件放在build\classes
目录下。

3. 生成jar文件

   C:\HelloWorld>antbuild
   会在build\lib目录中生成项目对应的jar文件。可以直接运行调用这个jar文件运行HelloWorld这个工程。

4. 运行工程

   C:\HelloWorld>ant run

   通过run这个target完成工程的运行

由此可见,使用Ant明显要方便很多

四、自动构建HelloWorld工程
上面我们使用Ant分步对HelloWorld工程进行构建,接下来我们使用Ant对HelloWorld这个工程进行自动构建。
在这里我们使用下面这个构建文件。

       <?xml version="1.0"encoding="UTF-8"?>

    

       <project name="HelloWorld" default="run" basedir=".">

             

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

             <property name="dest" value="build/classes"/>

             <property name="lib" value="build/lib"/>

             <property name="hello_jar" value="build/lib/hello.jar">

          

             <target name="init">

                    <mkdir dir="${dest}"/>

                    <mkdir dir="${lib}"/>

              </target>

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

                     <javac srcdir="${src}" destdir="${dest}"/>

              </target>

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

                     <jar destfile="${hello_jar}" basedir="${dest}">

                             <manifest>

                                   <attribute name="Main-Class" value="HelloWorld">

                              </manifest>

                     </jar>

                </target>

                 <target name="run"depends="build">

                        <java classname="HelloWorld" classpath="${hello_jar}"/>

                 </target>

                 <target name="clean">

                        <delete file="${hello_jar}"/>

                        <delete dir="${dest}"/>

                        <delete dir="${lib}">

                   </target>

          </project>

在这个Ant脚本中,我们定义了各个target之间的依赖关系,我们根据依赖关系就可以知道,执行的顺序是:

init--->compile--->build--->run--->clean

在调用ant的时候,先将工作路径切换到HelloWorld的工程目录,然后直接执行ant即可

C:\HelloWorld>ant

在没有指明执行哪个target的时候,直接调用project中default指明的默认target。

在这里,默认target是run,然后ant检测到执行run之前要执行build,执行build之前要执行compile,以此类推,可以检测到第一个target,从而开始执行整个ant脚本。

init--->compile--->build--->run--->clean

这样,只需要执行ant这个命令就可以完成整个HelloWorld工程的构建任务,从准备工作到编译打包执行,这些只需要一个指令就可以完成了。

完成以后,HelloWorld的工程目录结构为三部分:src文件夹、build.xml 脚本文件、build文件夹

五、Ant构建文件解析

Properties:

在Ant脚本中,property相当于定义了一个变量。这个变量在整个ant脚本中都可以使用。

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

我们还可以取出Ant内置的属性和系统变量的属性。

<?xml version="1.0" encoding="UTF-8"?>

<project name="HelloWorld" default="run"basedir=".">

<target name="prop">

     <echo message="${basedir}"/>

     <echo message="${ant.version}"/>

     <echo message="${ant.file}"/>

     <echo message="${ant.project.name}"/>

     <echo message="${ant.java.version}"/>

     <echo message="${os.name}"/>
//上面这段代码输出了几个Ant的内部属性,其中

basedir是在Ant脚本中定义的工作根目录

ant.version是Ant的版本

ant.file是使用的Ant脚本文件

ant.project.name是Ant脚本定义的project名称

ant.java.version是Ant使用的JDK版本
这些都是Ant的内置属性,所以无需定义,直接就可以使用

     <property environment="env"/>

     <echo message="${env.JAVA_HOME}"/>

     <echo message="${env.TOMCAT_HOME}"/>
//在Ant中同样可以访问系统的环境变量
使用系统环境变量时,首先要获取所有的环境变量<property environment="env"/>,并放在env中
在下面的程序中,使用${env.变量名称}来取对应的环境变量的值

</target>

</project>

Classpath:

在Java程序的开发和部署过程中,经常遇到的问题就是classpath的设置问题。

例如在程序中要使用到第三方的类库,那么在使用Ant构建这个工程的时候,必须指明这个第三方类库的classpath,否则工程的编译工作就不能通过。

<classpath id="project.class.path">

          <pathelementpath="${classpath}"/>

          <filesetdir="lib">

                <include name="**/*.jar"/>

           </fileset>

           <pathelementlocation="build/classes"/>

</classpath>
//上面这段代码定义了一个id为project.class.path的classpath
首先使用了classpath的嵌套元素,
然后把lib文件夹下的所有jar包路径添加到classpath中
最后把classes目录的路径加入classpath。
其中location属性制定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。

下面说明Classpath的使用方法。

例如在HelloWorld这个工程中,我们新增一个数据库访问的类,具体代码如下。

import java.sql.*;

public class HelloWorld{

public static void main(String[] args){

String className="com.microsoft.jdbc.sqlserver.SQLServerDriver";

Stringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";

String name="sa";

String password="123456";

Connection conn=null;

try{

Class.forName(className);

conn=DriverManager.getConnection(url,name,password);

}catch(Exception ex){

System.out.println(ex.getMessage());

}

System.out.println("取得的数据库连接为:"+conn);

}

}

我们修改了HelloWorld的代码,在这个类中,我们增加了数据库连接的内容。

如果不修改Ant脚本,编译不会通过。

因为在这个脚本中,没有指明数据库驱动类的位置,在连接数据库的时候找不到数据库驱动类。

针对这种情况,就需要在运行工程的时候,设置所需的classpath,注明使用到的第三方类

在这里,需要把用到的数据库驱动类文件:msbase.jar、mssqlserver.jar、msutil.jar放在HelloWorld根目录下的lib文件夹中,然后按照下面的方法修改build.xml文件中的run的target。

Ant脚本的编写不着急,暂告一段落。

停在蓝皮书---311页!

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: