【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变量中可以找到ant\bin目录的bat和cmd文件,随意配置,下面是我喜欢的配置方式)
1.3 运行测试ANT
ant -help 查看帮助信息即可
C:\Users\XXX\Desktop\antProject>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.+: 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:\Users\liqiang\Desktop\antProject>ls
build.xml C:\Users\liqiang\Desktop\antProject>ant
Buildfile: C:\Users\liqiang\Desktop\antProject\build.xml test:
[echo] Hello, world
[echo] This is info message. BUILD SUCCESSFUL
Total time: second
1.5如果xml文件的名字不是build.xml可以用-buildfile指定文件的名称
例如:文件的名字是buildXX.xml
C:\Users\liqiang\Desktop\antProject>ls
buildXX.xml C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml test:
[echo] Hello, world
[echo] This is info message. BUILD SUCCESSFUL
Total time: 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:\Users\liqiang\Desktop\antProject>ant -buildfile buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml BUILD SUCCESSFUL
Total time: second C:\Users\liqiang\Desktop\antProject>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:\Users\liqiang\Desktop\antProject>ls
buildXX.xml C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml test:
[mkdir] Created dir: C:\Users\liqiang\Desktop\antProject\tttt BUILD SUCCESSFUL
Total time: second C:\Users\liqiang\Desktop\antProject>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.copyfile\copydir复制文件或者目录
两个标签都有最基本的属性: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:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml
[javac] C:\Users\liqiang\Desktop\antProject\buildXX.xml:: warning: 'include
uild.sysclasspath=last; set to false for repeatable builds
[javac] Compiling source file to C:\Users\liqiang\Desktop\antProject
[javac] 警告: [options] 未与 -source 1.3 一起设置引导类路径
[javac] 警告: [options] 源值1.3已过时, 将在未来所有发行版中删除
[javac] 警告: [options] 目标值1.2已过时, 将在未来所有发行版中删除
[javac] 警告: [options] 要隐藏有关已过时选项的警告, 请使用 -Xlint:-options。
[javac] 个警告 BUILD SUCCESSFUL
Total time: seconds C:\Users\liqiang\Desktop\antProject>javap -c -v Test.class | grep major
major version:
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:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.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: seconds
13.2 LoadProperties读取properties文件内容
loadproperties标签,会加载properties文件中的内容为本文件的properties变量,通过${varname}可以获取变量的值,例如:
<project name="HelloWorld" default="" basedir="">
<loadproperties srcFile="log4j.properties"/>
<echo message="${log4j.rootLogger}"/>
</project>
结果:
C:\Users\liqiang\Desktop\antProject>cat log4j.properties | grep rootLo
log4j.rootLogger=debug, stdout C:\Users\liqiang\Desktop\antProject>ant -buildfile buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.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:\Users\liqiang\Desktop\antProject>cat .txt C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml BUILD SUCCESSFUL
Total time: seconds C:\Users\liqiang\Desktop\antProject>cat .txt
补充:学习了读取文件与替换文件,我们就可以用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:\Users\liqiang\Desktop\antProject>cat .txt C:\Users\liqiang\Desktop\antProject>cat .txt C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml BUILD SUCCESSFUL
Total time: seconds C:\Users\liqiang\Desktop\antProject>cat .txt
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:\xiangmu\MavenProject\build.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:\Users\liqiang\Desktop\antProject>ant -buildfile buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.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:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml t1:
[echo] ========= t3:
[echo] ========= t2:
[echo] ========= BUILD SUCCESSFUL
Total time: 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:\xiangmu\Exam\build.xml
[echo] basedir = E:\xiangmu\Exam
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:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml
[mytask]
[echo] ====================== test:
[mytask] BUILD SUCCESSFUL
Total time: 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:\Users\liqiang\Desktop\antProject>ant -buildfile buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml
[java]
[java]
[java]
[java] BUILD SUCCESSFUL
Total time: second
我们也可以用value传递单个参数,会当做一个字符串元素处理:
<project name="HelloWorld" default="" basedir="">
<java classname="Mytest" classpath="./;${classpath}">
<arg value="1 2 3 '4'"/>
</java>
</project>
结果:
C:\Users\liqiang\Desktop\antProject>ant -buildfile buildXX.xml
Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml
[java] '' BUILD SUCCESSFUL
Total time: 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:\xiangmu\MavenProject\build.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:\xiangmu\MavenProject\build.xml
test:
[echo] username
[echo] userpassword
BUILD SUCCESSFUL
Total time: 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同级的build\classes目录引入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:\xiangmu\Exam\build.xml
default:
[echo] E:\xiangmu\Exam
BUILD SUCCESSFUL
Total time: 358 milliseconds
补充:好像ant1.10.5需要JDK8支持,而ant1.9.13支持JDK7
【ANT】ant使用的更多相关文章
- Archive for required library: 'E:/repository/org/apache/ant/ant/1.7.1/ant-1.7.1.jar' in project 'test02' cannot be read or is not a valid ZIP file
Archive for required library: 'E:/repository/org/apache/ant/ant/1.7.1/ant-1.7.1.jar' in project 'tes ...
- [Ant]Ant简易教程
前言 Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供. Ant是纯Java语言编写的,所以具有 ...
- Ant——ant的使用
---------------------------------------------------------------------------------------------------- ...
- [Ant] Ant之MacroDef—“宏
转载自:http://lhq1013.iteye.com/blog/1157234 Ant是一个基于Java的跨平台构建工具,它易于使用,并且可扩展.可升级. MacroDef——“宏”,在An ...
- Ant—Ant标签解释
采用ant命令必须写ant命令脚本,脚本由非常多Ant标签组成.现在总结一下我也遇到过Ant标签: 版权声明:本文博主原创文章,博客,未经同意不得转载.
- Ant -----ant标签和自定义任务
随便记一下 Ant的用法吧.ant ,maven, gradle ,三个打包工具到齐了,Ant 常见标签解析,ant 自定义task . <?xml version="1.0" ...
- Ant :Property
Property Ant 内置的Property 系统属性 Ant附加的属性 自定义Property Ant :Property properties是由key-value组成的集合,就是Java中 ...
- Java构建工具Ant小记(一)
Ant简介 Ant是基于java的构建工具.理论上来说它类似与make工具,但是却克服了make的一些固有的缺陷. 传统的Make是基于操作系统shell的构建工具,虽然也可以基于工作的os对make ...
- Java MyEclipse下Ant build.xml简单实例详解
一.下载配置ant 1.首先下载ant: http://www.apache.org/ 下载最新的版本2.解压ant 后设置ANT_HOME, PATH中添加ANT_HOME目录下的bin目录(如:A ...
- 使用 Ant 自动生成项目构建版本
引言 对 于多版本项目,要提供新版本来跟上新功能或缺陷报告增加的速度,并同时仍然保持可接受的质量水平,可能是一项不小的挑战.构建自动化可确保准确性和消除人 为错误的可能性,从而部分地解决此问题.自动化 ...
随机推荐
- LOJ116 有源汇有上下界最大流(上下界网络流)
考虑有源汇上下界可行流:由汇向源连inf边,那么变成无源汇图,按上题做法跑出可行流.此时该inf边的流量即为原图中该可行流的流量.因为可以假装把加上去的那些边的流量放回原图. 此时再从原来的源向原来的 ...
- poj2965 【枚举】
The game “The Pilots Brothers: following the stripy elephant” has a quest where a player needs to op ...
- 洛谷P4768 [NOI2018]归程(可持久化并查集,最短路)
闲话 一个蒟蒻,在网络同步赛上进行了这样的表演-- T2组合计数不会,T3字符串数据结构不会,于是爆肝T1 一开始以为整个地图都有车,然后写了2h+的树套树,终于发现样例过不去 然后写可持久化并查集D ...
- android progressdialog 对话框试用实例
ProgressDialog 跟AlertDialog用法差不多,不同的是:ProgressDialog 显示的是一种"加载中"的效果,android 中 ProgressDial ...
- STM32外设地址查询
问题的提出 DMA传输SDIO驱动的SD卡的数据,其中外设地址的确定 问题的解决 打开数据参考手册,在存储器和总线架构一章存储器映像小节,有一个寄存器组起始地址表,列举所有外设对应的起始地址,再到相应 ...
- 【bzoj2007】 Noi2010—海拔
http://www.lydsy.com/JudgeOnline/problem.php?id=2007 (题目链接) 题意 $(n+1)*(n+1)$的网格图上,相邻两点间有一些人流.左上角点的海拔 ...
- rsync同步官方zabbix仓库搭建本地yum源
1.同步资源 # rsync -vrt rsync://repo.zabbix.com/mirror/zabbix/3.4/rhel/7/x86_64/ /home/mirrors/zabbix/3. ...
- Azure KeyVault设置策略和自动化添加secrets键值对
一. 关于Azure Key Vault Azure 密钥保管库可帮助保护云应用程序和服务使用的加密密钥和机密. 借助 Key Vault,可使用密钥来加密密钥和机密(例如身份验证密钥.存储帐户密钥. ...
- Android教程:在百度地图上画出轨迹
[日期:2013-04-14] 来源:Linux社区 作者:crazyxin1988 [字体:大 中 小] 接着上面的项目<Android访问webservice.客户端登录注册> ...
- A1102. Invert a Binary Tree
The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...