• 【ANT】ant使用


      

      官网:https://ant.apache.org/,task介绍:https://ant.apache.org/manual/index.html

    0.介绍:

      Ant的构建文件当开始一个新的项目时,首先应该编写Ant构建文件。构建文件定义了构建过程,并被团队开发中每个人使用。Ant构建文件默认命名为build.xml,也可以取其他的名字。只不过在运行的时候把这个命名当作参数传给Ant。构建文件可以放在任何的位置。一般做法是放在项目顶层目录中,这样可以保持项目的简洁和清晰。下面是一个典型的项目层次结构。 
    (1) src存放文件。 
    (2) class存放编译后的文件。 
    (3) lib存放第三方JAR包。 
    (4) dist存放打包,发布以后的代码。 
      Ant构建文件是XML文件。每个构建文件定义一个唯一的项目(Project元素)。每个项目下可以定义很多目标(target元素),这些目标之间可以有依赖关系。当执行这类目标时,需要执行他们所依赖的目标。每个目标中可以定义多个任务,目标中还定义了所要执行的任务序列。Ant在构建目标时必须调用所定义的任务。任务定义了Ant实际执行的命令。Ant中的任务可以为3类。 
    (1) 核心任务。核心任务是Ant自带的任务。 
    (2) 可选任务。可选任务实来自第三方的任务,因此需要一个附加的JAR文件。 
    (3) 用户自定义的任务。用户自定义的任务实用户自己开发的任务。

      说白了,ANT就是通过XML执行一些任务,可以简化操作,比如:编译Java,执行Java命令,打Jar包,打War包等操作。接下来会慢慢研究这些操作。

    1.ant安装

     1.1  下载解压即可。如下:

    1.2  配置环境变量(环境变量,无非就是让path变量中可以找到antin目录的bat和cmd文件,随意配置,下面是我喜欢的配置方式)

     

     1.3    运行测试ANT

    ant -help    查看帮助信息即可

    C:UsersXXXDesktopantProject>ant -help
    ant [options] [target [target2 [target3] ...]]
    Options:
      -help, -h              print this message and exit
      -projecthelp, -p       print project help information and exit
      -version               print the version information and exit
      -diagnostics           print information that might be helpful to
                             diagnose or report problems and exit
      -quiet, -q             be extra quiet
      -silent, -S            print nothing but task outputs and build failures
      -verbose, -v           be extra verbose
      -debug, -d             print debugging information
      -emacs, -e             produce logging information without adornments
      -lib <path>            specifies a path to search for jars and classes
      -logfile <file>        use given file for log
        -l     <file>                ''
      -logger <classname>    the class which is to perform logging
      -listener <classname>  add an instance of class as a project listener
      -noinput               do not allow interactive input
      -buildfile <file>      use given buildfile
        -file    <file>              ''
        -f       <file>              ''
      -D<property>=<value>   use value for given property
      -keep-going, -k        execute all targets that do not depend
                             on failed target(s)
      -propertyfile <name>   load all properties from file with -D
                             properties taking precedence
      -inputhandler <class>  the class which will handle input requests
      -find <file>           (s)earch for buildfile towards the root of
        -s  <file>           the filesystem and use it
      -nice  number          A niceness value for the main thread:
    the default
      -nouserlib             Run ant without using the jar files from
      -noclasspath           Run ant without using CLASSPATH
      -autoproxy             Java1.5+: use the OS proxy settings
      -main <class>          override Ant's normal entry point

    1.4使用ANT打印简单的信息

    一个简单的build.xml

    <project name="HelloWorld" default="test" basedir="">
      <target name="test">
        <echo message="Hello, world"/>
        <echo message="This is info message." level="info" />
      </target>
    </project>

    运行上面的build.xml:(直接ant就可以了)

    C:UsersliqiangDesktopantProject>ls
    build.xml
    
    C:UsersliqiangDesktopantProject>ant
    Buildfile: C:UsersliqiangDesktopantProjectuild.xml
    
    test:
         [echo] Hello, world
         [echo] This is info message.
    
    BUILD SUCCESSFUL
    Total time: 1 second

    1.5如果xml文件的名字不是build.xml可以用-buildfile指定文件的名称

      例如:文件的名字是buildXX.xml

    C:UsersliqiangDesktopantProject>ls
    buildXX.xml
    
    C:UsersliqiangDesktopantProject>ant -buildfile ./buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
    
    test:
         [echo] Hello, world
         [echo] This is info message.
    
    BUILD SUCCESSFUL
    Total time: 2 seconds

    2.ant常见标签的使用(其实常见的标签就是task)

      其实查看标签有什么属性,去task官网查看该task有什么属性即该标签有什么属性。下面只是介绍部分标签以及其重要属性,更全的标签参考官网   :https://ant.apache.org/manual-1.9.x/index.html

    1.<project>标签 

    每个构建文件对应一个项目。<project>标签时构建文件的根标签。它可以有多个内在属性,就如代码中所示,其各个属性的含义分别如下。 
    (1) default表示默认的运行目标,这个属性是必须的。 
    (2) basedir表示项目的基准目录。 
    (3) name表示项目名。 
    (4) description表示项目的描述。 
    每个构建文件都对应于一个项目,但是大型项目经常包含大量的子项目,每一个子项目都可以有自己的构建文件。 

    2.<target>标签 

      一个项目标签下可以有一个或多个target标签。一个target标签可以依赖其他的target标签。例如,有一个target用于编译程序,另一个target用于声称可执行文件。在生成可执行文件之前必须先编译该文件,因此可执行文件的target依赖于编译程序的target。Target的所有属性如下。 
    (1) name表示标明,这个属性是必须的。 
    (2) depends表示依赖的目标。 
    (3) if表示仅当属性设置时才执行。 
    (4) unless表示当属性没有设置时才执行。 
    (5) description表示项目的描述。 
    Ant的depends属性指定了target的执行顺序。Ant会依照depends属性中target出现顺序依次执行每个target。在执行之前,首先需要执行它所依赖的target

    3.ehco标签:最简单的打印信息的标签

    message:需要打印的信息,可以用${}取变量

    file:将message写入到文件中

    append:是否已追加模式写入文件

    level:级别,类似于日志级别(在开发工具中不能级别显示的信息不同)

    encoding:使用的编码格式

    force:是否强制写入到一个只读的文件中

    例如:

    <project name="HelloWorld" default="" basedir="">   
        <echo file="test.log" message="测试1" level="debug" append="true" encoding="utf-8"/>
        <echo file="test.log" message="测试2" level="info" append="true" encoding="utf-8"/>
        <echo file="test.log" message="测试3" level="warning" append="true" encoding="utf-8"/>
        <echo file="test.log" message="测试4" level="error" append="true" encoding="utf-8"/>
    </project>

    结果:

    C:UsersliqiangDesktopantProject>ant -buildfile buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
    
    BUILD SUCCESSFUL
    Total time: 1 second
    
    C:UsersliqiangDesktopantProject>cat ./test.log
    测试1测试2测试3测试4

    4.<mkdir>标签  

     该标签用于创建一个目录,它有一个属性dir用来指定所创建的目录名,如下:

    <project name="HelloWorld" default="test" basedir="">
      <target name="test">
        <mkdir dir = "tttt"/>
      </target>
    </project>

    或者:

    <project name="HelloWorld" default="" basedir="">
        <mkdir dir = "tttt"/>
    </project>

    执行上面脚本:

    C:UsersliqiangDesktopantProject>ls
    buildXX.xml
    
    C:UsersliqiangDesktopantProject>ant -buildfile ./buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
    
    test:
        [mkdir] Created dir: C:UsersliqiangDesktopantProject	ttt
    
    BUILD SUCCESSFUL
    Total time: 1 second
    
    C:UsersliqiangDesktopantProject>ls
    buildXX.xml  tttt

    5.<delete>标签 

    该标签用于删除一个文件或一组文件,属性如下: 

    (1).file表示要删除的文件。 
    (2).dir表示要删除的目录。 
    (3).includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。 
    (4).failonerror 表示指定当碰到错误是否停止,默认值是自动停止。 
    (5).verbose表示指定是否列出所删除的文件,默认值为不列出。

    例如删除一个文件夹:

    <project name="HelloWorld" default="" basedir="">
        <delete dir="ttt"/>
    </project>

    6.<copy>标签 (重要)

    该标签用于文件或文件集的拷贝,其属性如下。 
    (1).file 表示源文件。 
    (2).tofile 表示目标文件。 
    (3).todir 表示目标目录。 
    (4).overwrite 表示指定是否覆盖目标文件,默认值是不覆盖。 
    (5).includeEmptyDirs 表示制定是否拷贝空目录,默认值为拷贝。 
    (6).failonerror 表示指定如目标没有发现是否自动停止,默认值是停止。 
    (7).verbose 表示制定是否显示详细信息,默认值不显示。

    例如:复制文件

    <project name="HelloWorld" default="" basedir="">
        <copy file="buildXX.xml" tofile="./build.xml"/>
    </project>

    批量复制的脚本:

            <copy todir="${basedir}/dist/examBuildClass">
                <fileset dir="${basedir}/src">
                    <include name="**/**.xml" />
                </fileset>
            </copy>

      <include name="**/**.xml" />是包含本目录以及子目录的xml文件

     <include name="**.xml" />是本目录的xml文件,不包含子目录

    7.copyfilecopydir复制文件或者目录

      两个标签都有最基本的属性:src和dest表示源文件和目的文件

    <project name="HelloWorld" default="" basedir="">
        <copyfile src="buildXX.xml" dest="./build.xml"/>
    </project>

    8.Javac编译Java文件

    该标签用于编译一个或一组java文件,其属性如下: 
    (1).srcdir表示源程序的目录。 
    (2).destdir表示class文件的输出目录。 
    (3).include表示被编译的文件的模式。 
    (4).excludes表示被排除的文件的模式。 
    (5).classpath表示所使用的类路径。 
    (6).debug表示包含的调试信息。 
    (7).optimize表示是否使用优化。 
    (8).verbose 表示提供详细的输出信息。 
    (9).fileonerror表示当碰到错误就自动停止。

    例如:编译本目录下的一个java文件

    public class Test {
    
        public Test() {
        }
        public static void main(String[] args) {
            System.out.print("1");
        }
    
    }

    编译脚本

    <project name="HelloWorld" default="" basedir="">
          <javac srcdir="./"
             destdir="./"
             fork="true"
             source="1.2"
             target="1.2"
      />
    </project>

    测试:

    C:UsersliqiangDesktopantProject>ant -buildfile ./buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
        [javac] C:UsersliqiangDesktopantProjectuildXX.xml:7: warning: 'include
    uild.sysclasspath=last; set to false for repeatable builds
        [javac] Compiling 1 source file to C:UsersliqiangDesktopantProject
        [javac] 警告: [options] 未与 -source 1.3 一起设置引导类路径
        [javac] 警告: [options] 源值1.3已过时, 将在未来所有发行版中删除
        [javac] 警告: [options] 目标值1.2已过时, 将在未来所有发行版中删除
        [javac] 警告: [options] 要隐藏有关已过时选项的警告, 请使用 -Xlint:-options。
        [javac] 4 个警告
    
    BUILD SUCCESSFUL
    Total time: 6 seconds
    
    C:UsersliqiangDesktopantProject>javap -c -v Test.class | grep major
      major version: 46

    9.Java运行class文件

    该标签用来执行编译生成的.class文件,其属性如下。 
    (1).classname 表示将执行的类名。 
    (2).jar表示包含该类的JAR文件名。 
    (3).classpath所表示用到的类路径。 
    (4).fork表示在一个新的虚拟机中运行该类。 
    (5).failonerror表示当出现错误时自动停止。 
    (6).output 表示输出文件。 
    (7).append表示追加或者覆盖默认文件。

    例如运行上面的class文件:(必须指定classpath包含当前路径)

    <project name="HelloWorld" default="" basedir="">
         <java  classname="Test" classpath="./;${classpath}">
         </java>
    </project>

    补充:此标签也能运行Jar文件,类似于java -jar命令:

     例如,运行下面9打的jar包(必须制定fork参数,maxmemory制定JVM大小)

    <project name="HelloWorld" default="" basedir="">
           <java jar="app.jar" fork="true"   failonerror="true"
               maxmemory="128m"/>
    </project>

    10.jar打包

    该标签用来生成一个JAR文件,其属性如下。 
    (1) destfile表示JAR文件名。 
    (2) basedir表示被归档的文件名。 
    (3) includes表示别归档的文件模式。 
    (4) exchudes表示被排除的文件模式。

    例如打包上面的class文件:(下面命令会生成主菜单清单,也就是生成MANIFEST.MF,并且写入主函数入口,可以通过java -jar运行)

    <project name="HelloWorld" default="" basedir="">
           <jar destfile="./app.jar" basedir="./" includes="**/*.class" excludes="**/Test11111111111.class" >
                 <manifest>
                  <attribute name="Main-Class" value="Test"/>
                </manifest>
              </jar>
    </project>

    结果:

    11  war打war包的命令

       关于此task在weblogic编译JSP的时候就研究过,参考:https://www.cnblogs.com/qlqwjy/p/9676689.html

     12.  zip/unzip 压缩与解压缩

     zip用于压缩,打zip包,如下:

    <project name="HelloWorld" default="" basedir="">
             <zip destfile="./manual.zip" basedir="./"/>
    </project>

    结果:

    unzip用于解压缩

    <project name="HelloWorld" default="" basedir="">
             <zip destfile="./manual.zip" basedir="./"/>
    </project>

    13.   loadfile 读取文件内容,LoadProperties读取properties文件内容,loadresource可以用于获取某个URL的源码

    13.1  loadfile读取文件内容

      有时候我们希望读取一个的内容到某个属性中,例如:

    <project name="HelloWorld" default="" basedir="">
        <loadfile property="test" srcFile="./buildXX.xml" encoding="GBK"/>
        <echo message="${test}"/>
    </project>

    结果:

    C:UsersliqiangDesktopantProject>ant -buildfile ./buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
         [echo] <project name="HelloWorld" default="" basedir="">
         [echo]     <loadfile property="test" srcFile="./buildXX.xml" encoding="GBK"/>
         [echo]     <echo message="${test}"/>
         [echo] </project>
    
    BUILD SUCCESSFUL
    Total time: 2 seconds

    13.2    LoadProperties读取properties文件内容 

    loadproperties标签,会加载properties文件中的内容为本文件的properties变量,通过${varname}可以获取变量的值,例如:

    <project name="HelloWorld" default="" basedir="">
        <loadproperties srcFile="log4j.properties"/>
        <echo message="${log4j.rootLogger}"/>
    </project>

    结果:

    C:UsersliqiangDesktopantProject>cat log4j.properties | grep rootLo
    log4j.rootLogger=debug, stdout
    
    C:UsersliqiangDesktopantProject>ant -buildfile buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
         [echo] debug, stdout
    
    BUILD SUCCESSFUL
    Total time: 2 seconds

    13.3  loadresource可以用于获取某个URL的源码

      例如:获取某个http的源码。property是读取回来的property的变量,encoding指定解析的编码。

    <project name="HelloWorld" default="" basedir="">
        <loadresource property="indexresource" encoding="utf-8">
              <url url="http://qiaoliqiang.cn/"/>
        </loadresource>
        <echo message="${indexresource}"/>
    </project>

    14. replace 替换文件中的内容

      例如,一个txt文件中的原来的内容为123,我们用ant脚本将1换为3

    <project name="HelloWorld" default="" basedir="">
        <replace file="./1.txt" token="1" value="3"/>
    </project>

    结果:

    C:UsersliqiangDesktopantProject>cat 1.txt
    123
    C:UsersliqiangDesktopantProject>ant -buildfile ./buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
    
    BUILD SUCCESSFUL
    Total time: 3 seconds
    
    C:UsersliqiangDesktopantProject>cat 1.txt
    323

    补充:学习了读取文件与替换文件,我们就可以用ant脚本写一个文件的内容替换另一个文件的指定内容

    例如 1.txt内容是"321"      2.txt内容是"123 456" ,我们的需求是将2.txt中的123替换为1.txt中的内容。脚本如下:

    <project name="HelloWorld" default="" basedir="">
        <loadfile property="test" srcFile="./1.txt" encoding="GBK"/>
        <replace file="./2.txt" token="123" value="${test}"/>
    </project>

    结果:

    C:UsersliqiangDesktopantProject>cat 1.txt
    321
    C:UsersliqiangDesktopantProject>cat 2.txt
    123 456
    C:UsersliqiangDesktopantProject>ant -buildfile ./buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
    
    BUILD SUCCESSFUL
    Total time: 3 seconds
    
    C:UsersliqiangDesktopantProject>cat 2.txt
    321 456

    15.  Property定义变量

      设置一个本地变量, 可以通过${}多次调用。

    <project name="HelloWorld" default="" basedir="">
        <property name="var1" value="dist"/>
        <echo message="${var1}"/>
    </project>

    补充:其file属性也可以引入另一个properties文件,此种方式类似于我们项目中使用properties文件:

    ant.properties

    name=username
    password=userpassword

     build.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="HelloWorld" default="test" basedir="">
        <property file="ant.properties"></property>
        <target name="test">
            <echo message="${name}" />
            <echo message="${password}" level="info" />
        </target>
    </project>

     结果:

    Buildfile: E:xiangmuMavenProjectuild.xml
    test:
         [echo] username
         [echo] userpassword
    BUILD SUCCESSFUL
    Total time: 1 second

    16. Import 引进另一个build.xml到当前project(合并多个build.xml)

      import用于合并多个build.xml,可以简单理解为将另一个xml中project中的内容引入当前xml的project中。两个xml的project的name不能相同。

    例如:buildXX.xml

    <project name="HelloWorld" default="default" basedir="">
        <import file="./buildXX1.xml"/>
        <target name="default" depends="t1">
            <antcall target="t1"></antcall>
        </target>
    </project>

    buildXX1.xml

    <project name="HelloWorld1" default="" basedir="">
        <property name="var1" value="dist"/>
        <target name="t1">
            <echo message="${var1}"/>
        </target>
    </project>

    结果:

    C:UsersliqiangDesktopantProject>ant -buildfile buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
    
    t1:
         [echo] dist
    
    default:
    
    t1:
         [echo] dist

    17.   AntCall 在target中的任意位置调用其他target(antcall不能作为顶级节点,也就是必须嵌入到target中)

      有时我们在指定位置希望调用其他target,target的depends属性会在执行本target前就执行另一个target,antcall可以在指定位置调用另一个target

    <project name="HelloWorld" default="t3" basedir="">
        <target name="t1">
            <echo message="=====1===="/>
        </target>
        
        <target name="t2">
            <echo message="=====2===="/>
        </target>
    
        <target name="t3" depends="t1">
            <echo message="=====3===="/>
            <antcall target="t2"/>
        </target>
    </project>

    结果:

    C:UsersliqiangDesktopantProject>ant -buildfile ./buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
    
    t1:
         [echo] =====1====
    
    t3:
         [echo] =====3====
    
    t2:
         [echo] =====2====
    
    BUILD SUCCESSFUL
    Total time: 1 second

    18.Concat合并多个文件 

    目录结构:

    原来文件内容:

    exam.1.txt   

    111

    exam.2.txt

    222

    exam.3txt

    333

    exam.txt

    444

    (1)简单的合并文件,将文件内容合并到文件中:(是以覆盖的方式进行合并)

    <project name="exam" default="default" basedir=".">
        <!-- import properties file-->
        <echo message="basedir = ${basedir}"/>
    
        <target name="default">
            <concat destfile="${basedir}/exam.txt">Hello, World!</concat>
        </target>
    </project>

     控制台:

    Buildfile: E:xiangmuExamuild.xml
    [echo] basedir = E:xiangmuExam
    default:
    BUILD SUCCESSFUL
    Total time: 314 milliseconds

    查看exam.txt:

    Hello, World!

    (2)简单的合并文件,将文件内容合并到文件中:(以追加的方式进行合并-----append属性)

    <project name="exam" default="default" basedir=".">
        <!-- import properties file-->
        <echo message="basedir = ${basedir}"/>
    
        <target name="default">
            <concat destfile="${basedir}/exam.txt" append="true">Hello, World!</concat>
        </target>
    </project>

     查看exam.txt:

    Hello, World!Hello, World!

    (3)合并多个文件,以覆盖的方式进行合并

    <project name="exam" default="default" basedir=".">
        <!-- import properties file-->
        <echo message="basedir = ${basedir}" />
    
        <target name="default">
            <concat destfile="${basedir}/exam.txt">
                <filelist dir="${basedir}" files="exam.1.txt,exam.2.txt" />
                <fileset dir="${basedir}" includes="exam.*.txt" excludes="exam.txt" />
            </concat>
        </target>
    
    </project>

     查看exam.txt:

    111222111222333

     

    追加只用append=true

    19.  taskdef自定义task的用法:(自定义task实际就是自己编写java程序然后编译之后自定义标签)

      前提是自定义的task的类要有public xxx execute()方法,例如:

    public class Test {
    
        public Test() {
        }
        public void execute(){
            System.out.println("11111111");
        }
    
    }

    编译之后生成成class文件:

    编写自定义task并调用的脚本:

    <project name="HelloWorld" default="test" basedir="">
         <taskdef name="mytask" classpath="./" classname="Test"/>
        <mytask/>
    
        <echo message="======================"/>
    
        <target name="test">
                <mytask/>
        </target>
    </project>

    结果:

    C:UsersliqiangDesktopantProject>ant -buildfile ./buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
       [mytask] 11111111
         [echo] ======================
    
    test:
       [mytask] 11111111
    
    BUILD SUCCESSFUL
    Total time: 1 second

     3.ant常见的数据类型

    在构建文件中为了标识文件或文件组,经常需要使用数据类型。数据类型包含在    org.apache.tool.ant.types    包中。其实查看这些标签有哪些属性可以查看官网:http://ant.apache.org/manual-1.9.x/api/

    下面简单介绍构建文件中一些常用的数据类型。 

    1. argument 类型 (传递参数常用)

    由Ant构建文件调用的程序,可以通过<arg>元素向其传递命令行参数,如apply,exec和java任务均可接受嵌套<arg>元素,可以为各自的过程调用指定参数。以下是<arg>的所有属性。 
    (1)value 是一个命令参数。如果参数中有空格,但又想将它作为单独一个值,则使用此属性。 
    (2)file表示一个参数的文件名。在构建文件中,此文件名相对于当前的工作目录。 
    (3)line表示用空格分隔的多个参数列表。 
    (4)path表示路径。 

    例如:对于如下一段程序:

    public class Mytest {
        public static void main(String[] args) {
            for(String s:args){
                System.out.println(s);
            }
        }
    }

    我们可以通过line传递参数:(空格分隔的多个参数列表)

    <project name="HelloWorld" default="" basedir="">
        <java  classname="Mytest" classpath="./;${classpath}">
            <arg line="1 2 3 '4'"/>
         </java>
    </project>

    结果:

    C:UsersliqiangDesktopantProject>ant -buildfile buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
         [java] 1
         [java] 2
         [java] 3
         [java] 4
    
    BUILD SUCCESSFUL
    Total time: 1 second

    我们也可以用value传递单个参数,会当做一个字符串元素处理:

    <project name="HelloWorld" default="" basedir="">
        <java  classname="Mytest" classpath="./;${classpath}">
            <arg value="1 2 3 '4'"/>
         </java>
    </project>

    结果:

    C:UsersliqiangDesktopantProject>ant -buildfile buildXX.xml
    Buildfile: C:UsersliqiangDesktopantProjectuildXX.xml
         [java] 1 2 3 '4'
    
    BUILD SUCCESSFUL
    Total time: 2 seconds

    2.Path类型  (定义一个path路径,在其他标签通过classpathref引入对应ID即可)

    Path元素用来表示一个类路径,不过它还可以用于表示其他的路径。在用作揖个属性时,路经中的各项用分号或冒号隔开。在构建的时候,此分隔符将代替当前平台中所有的路径分隔符,其拥有的属性如下。 
    (1).location 表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。 
    (2).refid 是对当前构建文件中某处定义的一个path的引用。 
    (3).path表示一个文件或路径名列表。

    例如:(通过下面方法定义path路径,并在classpathref引入path的id即可)

    <project name="HelloWorld" default="" basedir="">
        <path id="myclass.classpath" path="./"></path>
    
        <java  classname="Mytest" classpathref="myclass.classpath" fork="true">
            <arg value="1 2 3 '4'"/>
         </java>
    
    </project>

    与上面等价功能的XML如下:

    <project name="HelloWorld" default="" basedir="">
        <path id="myclass.classpath" location="./"></path>
    
        <java  classname="Mytest" classpathref="myclass.classpath" fork="true">
            <arg value="1 2 3 '4'"/>
         </java>
    
    </project>
    <project name="HelloWorld" default="" basedir="">
        
        <path id="myclass.classpath" location="./"></path>
        <path id="myclass.classpath1" refid="myclass.classpath"></path>
    
        <java  classname="Mytest" classpathref="myclass.classpath1" fork="true">
            <arg value="1 2 3 '4'"/>
         </java>
    
    </project>

    3.filelist类型---FileList表示文件的显式命名列表。当您想要捕获文件列表时,无论文件当前是否存在,FileList都是有用的。filelist 指出的文件有可能是不存在的。(files属性能用*匹配)

     (1).dir是用于计算绝对文件名的目录。 
    (2).files 是用逗号分隔的文件名列表。 (如果是class文件不用写后缀,其他文件需要后缀,支持*通配符匹配)
    (3).refid 是对某处定义的一个<filelist>的引用。 
    注意  dir 和 files 都是必要的,除非指定了refid(这种情况下,dir和files都不允许使用)。

    例如:(filelist中通配符要用*,好像不支持xx*,或者*.xxx的用法,另外files引入class文件的时候不能写后缀.class,只能写文件名字)

    <project name="HelloWorld" default="" basedir="">   
        <filelist id="filelist1" dir="C:/Users/liqiang/Desktop" files="*"></filelist>    
    
        <path id="myclass.classpath">
            <filelist refid="filelist1"></filelist>    
        </path>
        <path id="myclass.classpath1" refid="myclass.classpath"></path>
    
        <java  classname="Mytest" classpathref="myclass.classpath1" fork="true">
            <arg value="1 2 3 '4'"/>
        </java>
    
    </project>

    与之等价的XML:

    <project name="HelloWorld" default="" basedir="">   
        <filelist id="filelist1" dir="C:/Users/liqiang/Desktop" files="Mytest"></filelist>    
    
        <path id="myclass.classpath">
            <filelist refid="filelist1"></filelist>    
        </path>
        <path id="myclass.classpath1" refid="myclass.classpath"></path>
    
        <java  classname="Mytest" classpathref="myclass.classpath1" fork="true">
            <arg value="1 2 3 '4'"/>
        </java>
    
    </project>

    如果是jar文件需要写文件后缀

    <project name="HelloWorld" default="" basedir="">   
        <filelist id="filelist1" dir="C:/Users/liqiang/Desktop/antProject" files="tt.jar"></filelist>    
    
        <path id="myclass.classpath">
            <filelist refid="filelist1"></filelist>    
        </path>
        <path id="myclass.classpath1" refid="myclass.classpath"></path>
    
        <java  classname="Mytest" classpathref="myclass.classpath1" fork="true">
            <arg value="1 2 3 '4'"/>
        </java>
    
    </project>

    4.fileset类型---引入的文件必须存在,否则会报错(而且 includesfile 属性不能用*匹配,引入所有文件都需要后缀)

    Fileset 数据类型定义了一组文件,并通常表示为<fileset>元素。不过,许多ant任务构建成了隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。以下为fileset 的属性列表。 
    (1).dir表示fileset 的基目录。 
    (2).casesensitive的值如果为false,那么匹配文件名时,fileset不是区分大小写的,其默认值为true。 
    (3).defaultexcludes 用来确定是否使用默认的排除模式,默认为true。 
    (4).excludes 是用逗号分隔的需要派出的文件模式列表。 
    (5).excludesfile 表示每行包含一个排除模式的文件的文件名。 
    (6).includes 是用逗号分隔的,需要包含的文件模式列表。 
    (7).includesfile 表示每行包括一个包含模式的文件名。 

    例如:引入class文件

    <project name="HelloWorld" default="" basedir="">   
        <fileset id="fileset1" dir="./">
            <include name="Mytest" />
        </fileset>
    
        <path id="myclass.classpath">
            <fileset refid="fileset1"></fileset>    
        </path>
        <path id="myclass.classpath1" refid="myclass.classpath"></path>
    
        <java  classname="Mytest" classpathref="myclass.classpath1" fork="true">
            <arg value="1 2 3 '4'"/>
        </java>
    
    </project>

    与之等价的脚本:

    <project name="HelloWorld" default="" basedir="">   
        <fileset id="fileset1" dir="./" includesfile="Mytest.class"></fileset>
    
        <path id="myclass.classpath">
            <fileset refid="fileset1"></fileset>    
        </path>
        <path id="myclass.classpath1" refid="myclass.classpath"></path>
    
        <java  classname="Mytest" classpathref="myclass.classpath1" fork="true">
            <arg value="1 2 3 '4'"/>
        </java>
    
    </project>

    5.dirset    使用该类型的元素会直接定位到某个目录并引入相应文件,常用的属性:

      id:定义唯一的ID

      refid:引用其他的dirset的id

      dir:表示目录的位置

    例如:(下面定义了dirset与path,用通过refid引入了其他dirset与path)

    <project name="HelloWorld" default="" basedir="">   
        <dirset id="basedirset" dir="./"></dirset>
    
        <path id="myclass.classpath">
            <dirset refid="basedirset"></dirset>
        </path>
        <path id="myclass.classpath1" refid="myclass.classpath"></path>
    
        <java  classname="Mytest" classpathref="myclass.classpath1" fork="true">
            <arg value="1 2 3 '4'"/>
        </java>
    
    </project>

    例如下面脚本将桌面的class文件包含到   basedirset  中:

    <project name="HelloWorld" default="" basedir="">   
        <dirset id="basedirset" dir="C:/Users/liqiang/Desktop/">
            <include name="*.class"/>
        </dirset>
    
        <path id="myclass.classpath">
            <dirset refid="basedirset"></dirset>
        </path>
        <path id="myclass.classpath1" refid="myclass.classpath"></path>
    
        <java  classname="Mytest" classpathref="myclass.classpath1" fork="true">
            <arg value="1 2 3 '4'"/>
        </java>
    
    </project>

    4.ant在eclipse中的使用:

      任何工具都会集成到开发工具中,像SVN,maven,git都与eclipse集成,当然ant也不例外。下面会在eclipse中使用ant。

    一般版本直接集成了ant,所以直接使用即可。

    1.新建一antfiles(也就是新建一个build.xml)

    工程结构如下:

     输入以下脚本进行测试:

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="HelloWorld" default="test" basedir="">
      <target name="test">
        <echo message="Hello, world"/>
        <echo message="This is info message." level="info" />
      </target>
    </project>

    2. 直接右键 run as -> ant build即可,结果如下:

    Buildfile: E:xiangmuMavenProjectuild.xml
    test:
         [echo] Hello, world
         [echo] This is info message.
    BUILD SUCCESSFUL
    Total time: 1 second

    3.新建一properties文件并且在build.xml中引入该properties文件进行测试:

    ant.properties

    name=username
    password=userpassword

    build.xml脚本:

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="HelloWorld" default="test" basedir="">
        <property file="ant.properties"></property>
        <target name="test">
            <echo message="${name}" />
            <echo message="${password}" level="info" />
        </target>
    </project>

    结果:

    Buildfile: E:xiangmuMavenProjectuild.xml
    test:
         [echo] username
         [echo] userpassword
    BUILD SUCCESSFUL
    Total time: 1 second

    4.在eclipse中类似于运行tomcat 的server一样运行ant

    (1)打包ant视图: window->show view 

     

    (2)空白处右击然后add buildfiles

    (3)选中我们的build.xml

    (4)直接双击test运行该target即可。

    5.eclipse中配置ant的环境

     可以设置需要执行的target以及JRE等参数:(可以选择多个target进行执行)

     

    上面配置相当于设置了快捷方式,运行的时候点击下面即可:(相当于运行指定build.xml的默认target)

      

     5.ant常见问题:

    1.ant也有编译的JRE版本,在编译JDK8的时候由于ant使用JDK7搞死我了--:

    eclipse选中如图位置:External xxx....

    配置ant的jre版本:

    2:如果有错误并且ant日志乱码,解决办法如下:

      在运行时修改ant 的运行时输出编码,我们添加(<sysproperty key="file.encoding" value="UTF-8" />) 后,控制台就可以正常显示中文了,如下:

        <!-- ================================= 
        target: precompile 
        ================================= -->
        <target name="precompile" description="--> description">
            <!--compile JSP-->
            <java classname="weblogic.jspc" classpathref="wls.classpath" fork="true" failonerror="yes" maxmemory="1028m">
                <sysproperty key="file.encoding" value="utf-8"/>
                <arg line="-advanced" />
            </java>
        </target>

    3.如果我们希望在编译的classpath中引入某个目录下的class文件作为classpath,办法如下dirset就是将与build.xml同级的buildclasses目录引入classpath(一般eclipse编译后文件在这个目录):

    <path id="wls.classpath">
            <fileset dir="${wls_home}/server/lib">
                <include name="*.jar" />
            </fileset>
            <dirset dir="./build/classes">
            </dirset>
        </path>

    上面dirset等同于下面配置:(fileset可以jar可以class)

                <fileset dir="E:/xiangmu/WebTest/WebContent/WEB-INF/classes"
                    includes="*.class">
                </fileset>

    补充:build.xml中basedir可以定义一个全局的位置变量,.代表当前位置,例如

    <project name="exam" default="default" basedir=".">
        <target name="default">
            <echo message="${basedir}"/>
        </target>
    </project>

    结果:

    Buildfile: E:xiangmuExamuild.xml
    default:
    [echo] E:xiangmuExam
    BUILD SUCCESSFUL
    Total time: 358 milliseconds

    补充:好像ant1.10.5需要JDK8支持,而ant1.9.13支持JDK7

  • 相关阅读:
    面试生信工程师2
    R语言矩阵相关性计算及其可视化?
    PCA方差解释比例求解与绘图?
    MySQL 练习
    oracle高级数据查询技术
    Oracle安全管理
    基本查询语句
    管理表
    oracle PL/SQL高级编程
    oracle视图与索引
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/9678105.html
Copyright © 2020-2023  润新知