zoukankan      html  css  js  c++  java
  • Ant基础

    一 Ant 介绍

    Ant是构建工具,用来实现软件的自动化的构建,类似于VisualStudio的project文件,Linux上构建C++的makefile,Ant通常用来构建Java程序。

    Ant是基于XML的文件,所以更容易阅读;Ant是用Java实现的,本身支持跨平台;Ant基于插件的方式开发,本身内置了常用的大部分的插件,而且第三方的扩展也很容易;Ant除了用来构建Java程序,也可以用来构建其他的任何程序,例如C++等。

    和Ant类似,能够支持跨平台的其他的一些非常优秀的构建工具有Maven,Scons,CMake等。

    二 Ant的配置

    1)安装jdk,设置
    JAVA_HOME=D:\Java\Jdk1.5
    classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

    path=%JAVA_HOME%\bin;%path%

    2)下载安装Ant,且设置
    ANT_HOME=E:\Lab\apache-ant-1.8.2

    path=E:\Lab\apache-ant-1.8.2\bin

    3) 最后验证是否安装成功在dos中输入ant,如果显示

    Buildfile: build.xml does not exist!

    Build failed

    则安装成功

    三 Ant的基础元素

    1)Project元素

    Project元素是Ant文件的根元素,Ant构建文件中至少应该包含一个project元素,否则会发生错误。在每个project元素下面可以包含多个target元素。project的属性包括:

    name : 项目名称

    default:当调用时没有指定target时,此project的默认targe

    basedir:用于指定基路径的位置,改属性没有指定时,使用Ant的构建文件的父目录作为基路径

    例如:
    < ?xml version="1.0" ?>
    < project name ="antPro" default ="getBaseDir" basedir ="C:/ThinkInJavaCode">
    <target name="getBaseDir">
    <echo message="The base dir is: ${basedir}"/>
    </target>
    < /project>

    从上例可以看出,在这里定义了default 属性的值为getBaseDir ,即当运行ant 命令时,如果没有指明待执行的target,则将执行默认的target--getBaseDir 。此外,还定义了basedir 属性的值为 "C:/ThinkInJavaCode" ,进入"C:/ThinkInJavaCode" 后运行ant 命令,得一下结果:
    Buildfile: C:\ThinkInJavaCode\build.xml

    sayBaseDir:
    [echo] The base dir is: C:\ThinkInJavaCode


    BUILD SUCCESSFUL
    Total time: 0 seconds

    2)target元素

    target为Ant的基本执行单元,他可以包含一个或多个具体的任务。

    target的属性有:

    name: target的名称,这个属性在一个project中是唯一的。我们可以通过指定 target 元素的名称来指定某个 target 。

    depends:用来描述target间的依赖关系,若与多个 target 存在依赖关系时,需要以“,”间隔。 Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target 。被依赖的 target 会先执行。

    if:用于验证指定的属性是否存在,若不存在,所在 target 将不会被执行。

    unless:该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行。

    description:该属性是关于 target 功能的简短描述和说明。


    多个target可以存在相互依赖的关系。Ant会依照depends属性中target出现的顺序依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。

    <target name="A"/>

    <target name="B" depends="A"/>

    <target name="C" depends="B"/>

    <target name="D" depends="C,B,A"/>

    假定我们要执行target D。从它的依赖属性来看,你可能认为先执行C,然后B,最后A被执行。错了,C依赖于B,B依赖于A,所以先执行A,然后B,然后C,最后D被执行。

    一个target只能被执行一次,即时有多个target依赖于它。

    3)property元素

    property元素可看作变量或者参数的定义(即经常使用的变量),project 的属性可以通过 property 元素来设定,也可在 Ant 之外设定。例如<property name ="name" value ="philander"/>。若要在外部引入某文件,例如 build.properties 文件,可以通过如下内容将其引入<property file=” build.properties”/>。

    Ant 提供了一些内置的属性,它能得到的系统属性的列表与 Java 文档中 System.getPropertis() 方法得到的属性一致,这些系统属性可参考 sun 网站的说明。同时, Ant 还提供了一些它自己的内置属性,如下:

    basedir:project 基目录的绝对路径;

    ant.file:buildfile的绝对路径,上例中ant.file值为C:\ThinkInJavaCode\build.xml;

    ant.version:Ant 的版本信息,本文为1.8.1 ;

    ant.project.name:当前指定的project的名字,即前文说到的project的name属性值;

    ant.java.version:Ant 检测到的JDK版本,本文为 1.6 。

    举例说明如下:
    <? xml version="1.0" ?>
    <project name ="propertyPro" default ="example">
    <property name ="name" value ="philander"/>
    <property name ="age" value ="25"/>
    <target name ="example">
    <echo message ="name: ${name}, age: ${age}"/>
    </target>
    </project>

    上例中用户设置了名为name 和age的两个属性,这两个属性设置后,在下文中可以通过 ${name} 和 ${age} 分别取得这两个属性值。

    四 ANT常用命令

    1. copy 命令

    copy主要用来对文件和目录的复制功能。举例如下:

    eg1. 复制单个文件:
    <copy file="original.txt" tofile="copied.txt"/>

    eg2. 对文件目录进行复制:
    <copy todir="../dest_dir">

    <fileset dir="src_dir"/>
    </copy>

    eg3. 将文件复制到另外的目录:
    <copy file="source.txt" todir="../home/philander"/>


    2. delete 命令

    对文件或目录进行删除,举例如下:

    eg1. 删除某个文件:
    <delete file="/home/photos/philander.jpg"/>

    eg2. 删除某个目录:
    <delete dir="/home/photos"/>

    eg3. 删除所有的备份目录或空目录:
    <delete includeEmptyDirs="true">
    <fileset dir="." includes="**/*.bak"/>
    </delete>


    3. mkdir 命令

    创建目录。 eg :
    <mkdir dir="/home/philander/build/classes"/>


    4. move 命令

    移动文件或目录,举例如下:

    eg1. 移动单个文件:
    <move file="sourcefile" tofile=”destfile”/>

    eg2. 移动单个文件到另一个目录:
    <move file="sourcefile" todir=”movedir”/>

    eg3. 移动某个目录到另一个目录:

    <move todir="newdir"> <fileset dir="olddir"/></move>


    5. echo 命令

    该任务的作用是根据日志或监控器的级别输出信息。它包括 message 、 file 、 append 和 level 四个属性,举例如下
    <echo message="Hello,ANT" file="/home/philander/logs/ant.log" append="true">


    五 利用ant 构建和部署Java项目

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


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

    Ant 的javac命令用于实现编译Java 程序的功能。下面来看一个简单的例子:首先我们建立名为 JavaTestPro的Java项目,建立src目录为源代码目录,在src目录下建立HelloWorld.java这个类文件。该类文件的内容如下:
    public class HelloWorld {
    public static void main(String[] args) {
    System.out.println("hello world!");
    }
    }

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

    |JavaTestPro

    |src

    |build

    |classes

    |build.xml

    在编译前,需清除classes 目录,该文件的内容如下:
    <?xml version="1.0" ?>
    <project name ="javacTest" default="compile" basedir=".">
    <target name="clean">
    <delete dir="${basedir}/build"/>
    </target>
    <target name="compile" depends ="clean">
    <mkdir dir ="${basedir}/build/classes"/>
    <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
    </target>
    </project>

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


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

    Ant 中可以使用 java命令实现运行Java程序的功能。可以在上面的build.xml基础上做修改来实现:
    <?xml version="1.0" ?>
    <project name ="javacTest" default="run" basedir=".">
    <target name="clean">
    <delete dir="${basedir}/build"/>
    </target>
    <target name="compile" depends ="clean">
    <mkdir dir ="${basedir}/build/classes"/>
    <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
    </target>
    <target name="run" depends ="compile">
    <java classname ="HelloWorld">
    <classpath>
    <pathelement path="${basedir}/build/classes"/>
    </classpath>
    </java>
    </target>
    </project>

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


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

    还可以在上例的基础上更进一步,来生成jar包,可在run 这个 target 下再加上如下 target :
    <?xml version="1.0" ?>
    <project name ="javacTest" default="jar" basedir=".">
    <target name="clean">
    <delete dir="${basedir}/build"/>
    </target>
    <target name="compile" depends ="clean">
    <mkdir dir ="${basedir}/build/classes"/>
    <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
    </target>
    <target name="run" depends="compile">
    <java classname ="HelloWorld">
    <classpath>
    <pathelement path="${basedir}/build/classes"/>
    </classpath>
    </java>
    </target>
    <target name="jar" depends="run">
    <jar destfile="helloworld.jar" basedir="${basedir}/build/classes">
    <manifest>
    <attribute name="Main-class" value="HelloWorld"/>
    </manifest>
    </jar>
    </target >
    </project>

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


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

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

    |WebContent

    |src

    |build

    |classes

    |WebContent

    |META-INF

    |MANIFEST.MF

    |WEB-INF

    |lib

    |classes

    |HelloJSP.jsp

    |build.xml

    读者可以 src 目录下放入在前续例子中开发的 HelloWorld.java 文件,并在 WebContent下建立 HelloJSP.jsp 文件,其内容很简单,就是输出 Hello 信息,代码如下所示如下
    <%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>war test for ant</title>
    </head>
    <body>
    Hello JSP!Hello Ant!
    </body>
    </html>

    接下来编写 build.xml 文件,其内容如下:
    <?xml version="1.0" encoding="UTF-8" ?>
    <project name ="WebTest" default ="war" basedir =".">
    <property name ="classes" value ="${basedir}/build/classes"/>
    <property name ="build" value ="${basedir}/build"/>
    <property name ="lib" value ="${basedir}/WebContent/WEB-INF/lib"/>
    <!-- 删除build 路径-->
    <target name ="clean">
    <delete dir ="${build}"/>
    </target>

    <!-- 建立build/classes 路径,并编译class 文件到build/classes 路径下-->
    <target name ="compile" depends ="clean">
    <mkdir dir ="${classes}"/>
    <javac srcdir ="${basedir}/src" destdir ="${classes}"/>
    </target>

    <!-- 打war 包-->
    <target name ="war" depends ="compile">
    <war destfile ="${build}/WebTest.war" webxml ="${basedir}/WebContent/WEB-INF/web.xml">
    <!-- 拷贝WebRoot 下除了WEB-INF 和META-INF 的两个文件夹-->
    <fileset dir ="${basedir}/WebContent" includes ="**/*.jsp"/>
    <!-- 拷贝lib 目录下的jar 包-->
    <lib dir ="${lib}"/>
    <!-- 拷贝build/classes 下的class 文件-->
    <classes dir ="${classes}"/>
    </war>
    </target>
    </project>

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

    参考:

    http://www.cnblogs.com/wangchenyang/archive/2011/09/14/2176688.html

    http://www.cnblogs.com/philander/articles/1782254.html

  • 相关阅读:
    Spring Boot 入门实战(7)--JdbcTempalte、Mybatis、动态数据源及 Atomicos 整合(XA 事务)
    L1-058 6翻了 (15 分)
    L1-057 PTA使我精神焕发 (5 分)
    L1-056 猜数字 (20 分)
    L1-055 谁是赢家 (10 分)
    L1-054 福到了 (15 分)
    L1-053 电子汪 (10 分)
    L1-052 2018我们要赢 (5 分)
    L1-051 打折 (5 分)
    L1-050 倒数第N个字符串 (15 分)
  • 原文地址:https://www.cnblogs.com/itech/p/2230059.html
Copyright © 2011-2022 走看看