这里以一个简单、实用的例子来说明FTP task的使用。
<?xml version="1.0" encoding="UTF-8"?>
<project name="FTP" default="sendFilesToFTP" basedir="c:\ant">
<target name="sendFilesToFTP">
<ftp server="10.1.0.243" port="21" userid="dmweb" password="dmweb21" remotedir="/home/dmweb/testD" depends="yes" verbose="yes">
<fileset dir="${basedir}">
<include name="test/*.xml" />
</fileset>
</ftp>
</target>
</project>
红色字体部分的代码,就是一个FTP task,它完成的功能是把本地目录c:\ant下子目录test中的所有更改过的xml文件传送到地址为10.1.0.243的FTP服务器的/home/dmweb/testD目录。
一个FTP task以<ftp></ftp>来表示,<ftp>包含很多属性用于配置任务: server、port属性设置FTP的地址和连接使用的端口。
userid、password属性设置连接FTP时使用到的用户名和密码。
remotedir属性设置要访问的FTP远程目录,如果remotedir没有设置,则默认为FTP上登录用户的默认目录。
depends属性如果设置成yes/true的话,表示只传送更改过的文件,默认值为no/false。
verbose属性如果设置成yes/true的话,在FTP任务执行的时候,会打印出所有传送文件的列表信息,默认值为no/false。
我们发现代码中,并没有指明这个FTP任务是要执行什么操作,但其实这个FTP任务是执行上传操作。FTP task有一个action属性,用于指明执行哪种FTP操作(send, receive, list, delete files, and create directories),当未设置action属性时,默认是执行send(上传)操作,你可以设置这个属性执行你想要的操作。
包含在<ftp>与</ftp>中的filter,大家应该都很熟悉,它与copy任务中filter作用一样,在这里它指定了本地的目录,并说明被传送的文件只包括该目录下test子目录中的所有xml文件。
第二篇:Ant学习总结
Ant学习总结
分类: java 20##-12-04 09:52 224人阅读 评论(0) 收藏 举报
一、Ant介绍
Ant是Java的生成工具,是Apache的核心项目;直接在apache官网下载即可;
Ant类似于Unix中的Make工具,都是用来编译、生成;
Ant是跨平台的,而Make不能;
Ant的主要目的就是把你想做的事情自动化,不用你手动一步一步做,因为里面内置了javac、java、创建目录、复制文件等功能,所以可以直接点击Ant文件,即可编译生成你的项目;
下载地址: http://ant.apache.org/bindownload.cgi
二、Ant配置
在Ant安装之前需要安装好JDK,并配置好JAVA_HOME;
Ant配置:
1.新建环境变量ANT_HOME:值为ANT的主目录;
2.在path中配置%ANT_HOME%/bin;
配置完成之后,打开命令行,输入ant,当出现:
Buildfile: build.xml does not exist!
Build failed
时说明配置完成;
三、Ant入门
ant的默认生成文件为build.xml;输入ant后,ant会在当前目录下搜索是否有build.xml,如果有,则执行;当然也可以自定义生成文件,通过ant -f a.xml即可指定a.xml为生成文件;
ant的生成文件是xml文件,整体结构为:
[html] view plaincopyprint?
1. <?xml version="1.0" encoding="GBK"?>
2. <project default=" targetname">
3. <target name="name">
4. </target>
5. </project>
project是生成文件的根元素,表示一个工程;
target是project的子元素,表示一个任务;一个project中可以定义多个target元素,表示多个任务;
default属性表示默认执行的target,如果ant命令没有指定target,则执行default的target;
ant targetname;则会执行此target,而忽略default设置的target;
注意:不能有两个相同的targetname;
代码举例:创建并删除hello目录;
[html] view plaincopyprint?
1. <?xml version="1.0" encoding="gbk"?>
2. <project default="delete">
3. <property name="name" value="xiazdong"/>
4. <target name="delete" depends="mkdir">
5. <delete dir="${name}"/>
6. </target>
7. <target name="mkdir">
8. <mkdir dir="${name}"/>
9. </target>
10. </project>
四、Ant的XML元素详解
1.<project>元素
是Ant生成文件的根元素;一般形式如:
<project default=" "[ basedir="." ] [name="projectname"]>
default的值是默认执行的target名;
basedir是指定基准目录,一般都是basedir="."
name是指工程名字;
2.<target>元素
是project元素的子元素,在project元素中能够有多个target;一般形式如下:
<target name=" " [ depends=" A "] [ if =" prop1 "] [ unless=" prop2"]>
</target>
name表示target的名称;
depends中填写其他target名称(可以有多个名称,用逗号分割),表示只有targetA完成之后才能够做此target,如果执行此target,则会先执行A;
if的值表示一个属性名,只有设置了该属性名,才能执行此target;
unless的值表示一个属性名,只有没有设置该属性名,才能执行此target;
3.<property>元素
是project的子元素;property用于定义属性,一般形如:
(1)<property name=" pname " value=" pvalue "/>
如果要使用此property,则需要${pname};类似于表达式语言;
(2)<property file="a.properties"/> 通过此属性文件导入属性;
如果单纯想使用$,则通过$$表示;
五、Task介绍
在Ant中Task是target的子元素,即一个target中可以有多个task;而Task分为:
(1)核心Task;
(2)可选Task;
(3)自定义Task;
下面介绍一些常用的核心Task;
1.<echo>
用于单纯输出,一般形如:
<echo> </echo>
举例:<echo>hello</echo>
2.<javac>
用于编译java文件,一般形式如下:
<javac srcdir=" src " destdir=" class " [classpath=" "]/>;
srcdir是编译此文件夹下或子文件夹下的全部java文件;
destdir是编译后的class文件放置路径;
classpath指定第三方类库;
3.<java>
运行java类,一般形式如下:
<java classname=" " fork="yes">
【<arg line="param1 param2 param3"/>】
</java>
classname用于指定运行的类名称;
fork="yes"表示另起一个JVM来执行java命令,而不是中断ANT命令,因此fork必须为yes;
4.<jar>
打包成jar包;一般形式如下:
<jar destfile=" main.jar" basedir=" ">
<manifest>
<attribute name="Main-Class" value="classname"/> <!--指定主类-->
</manifest>
</jar>
destfiie的值为jar包的名称;一般为${dest}/main.jar;
basedir的值是需要打成jar包的目录;一般为${classes}
manifest表示设置META-INF;
5.<mkdir>
创建目录,可以多层创建,比如a\b\c,则可以连续创建,一般形式如下:
<mkdir dir="a\b"/>
6.<delete>
删除目录,一般形式如下:
<delete dir="a\b"/> 可以删除a目录下的b目录;
<delete file="1.txt"/>可以删除文件;
7.<tstamp>
时间戳,一般形式如下:
<tstamp />
接下来可以使用${DSTAMP}进行调用当前时间;
8.<copy>
复制文件,一般形式如下:
<copy file="file1" tofile="file2"/>
file是源文件;
tofile是目标文件;
9.<move>
移动文件,一般形式如下:
<move file="file1" tofile="file2"/>
file是源文件;
tofile是目标文件;
10.<replace>
用于替换字符串,类似于String的replace操作,一般形式如下:
<replace file="filename" token="old" value="new"/>
file表示要执行替换的文件;
token表示被替换的字符串;
value表示替换的字符串;
代码举例:一般项目中的ant结构
[html] view plaincopyprint?
1. <project default="init">
2. <property name="src" value="src"/>
3. <property name="classes" value="classes"/>
4. <property name="dest" value="dest"/>
5. <path id="classpath">
6. <pathelement path="${classes}"/>
7. </path>
8. <target name="help">
9. <echo>help -打印帮助信息</echo>
10. <echo>compile -编译java源文件</echo>
11. <echo>run -运行程序</echo>
12. <echo>build -打成jar包</echo>
13. <echo>clean -清楚全部编译生成文件</echo>
14. </target>
15. <target name="compile">
16. <delete dir="${classes}"/>
17. <mkdir dir="${classes}"/>
18. <javac srcdir="${src}" destdir="${classes}"/>
19. </target>
20. <target name="run" depends="compile">
21. <java classname="org.xiazdong.Test" fork="yes">
22. <classpath path="${classes}"/>
23. </java>
24. </target>
25. <target name="build" depends="run">
26. <delete dir="${dest}"/>
27. <mkdir dir="${dest}"/>
28. <jar destfile="${dest}/Test.jar" basedir="${classes}">
29. <manifest>
30. <attribute name="Main-Class" value="org.xiazdong.Test"/>
31. </manifest>
32. </jar>
33. </target>
34. <target name="clean">
35. <delete dir="${classes}"/>
36. <delete dir="${dest}"/>
37. </target>
38. </project>
总结一下:
[html] view plaincopyprint?
1. <?xml version = "1.0" encoding="GBK"?>
2. <project name="Test" default="" basedir=".">
3. <property name="src" value="${basedir}\src"/>
4. <property file="${basedir}\a.properties"/>
5. <!--
6. path用法
7. 1.id属性表示编号,用于被引用
8. -->
9. <path id="classpath">
10. <!--
11. pathelement的用法
12. 1.path表示多个目录,用“;”隔开目录
13. 2.location表示一个目录
14. -->
15. <pathelement path="lib;src"/>
16. <pathelement location="lib"/>
17. <!--
18. dirset的用法
19. 1.dir属性指定根目录
20. 2.子元素<include name=" "/>表示包含的目录
21. 3.子元素<exclude name=" "/>表示不包含的目录
22. -->
23. <dirset dir="lib">
24. <include name="**/*Test*"/>
25. <exclude name="**/class"/>
26. </dirset>
27. <!--
28. filelist的用法
29. 1.dir属性指定根路径
30. 2.files属性指定文件名的列表,用","隔开
31. -->
32. <filelist dir="lib" files="a.xml,b.xml"/>
33. <!--
34. fileset用法
35. 1.dir属性指出根路径
36. 2.子元素<include name=" "/>指定包含的文件名
37. -->
38. <fileset dir="lib">
39. <include name="**/*.jar"/>
40. </fileset>
41. </path>
42. <!--
43. target用法
44. 1.表示任务,子元素为各种task的集合;
45. -->
46. <target name="target1">
47. <!--
48. javac用法
49. 1.srcdir表示java文件的目录
50. 2.destdir表示class文件的保存目录
51. -->
52. <javac srcdir="src" destdir="bin">
53. <!--
54. classpath用法
55. 1.refid引用前面的path指定的路径
56. -->
57. <classpath refid="classpath"/>
58. </javac>
59. <!--
60. java用法
61. 1.classname表示要运行的类
62. 2.fork="yes"一定要写上!!
63. -->
64. <java classname="Test" fork="yes">
65. <classpath refid="classpath"/>
66. <!--
67. arg表示指定的参数
68. -->
69. <arg value="a b c"/>
70. </java>
71. <!--
72. echo表示输出
73. -->
74. <echo>Hello world</echo>
75. <!--
76. copy表示复制文件
77. delete表示删除文件
78. mkdir表示创建目录
79. move表示移动文件
80. -->
81. <copy file="src.txt" tofile="dest.txt"/>
82. <delete dir="src"/>
83. <mkdir dir="src"/>
84. <move file="src.txt" tofile="dest.txt"/>
85. </target>
86. </project>
五、在Eclipse中使用Ant
在Eclipse中虽然没有内置创建Ant的生成文件,但是可以通过配置完成;
(1)点击 window-->preferences-->editors-->file associations;
(2)在File types中创建一个build.xml,并将associated editor的默认项设置为ant editor即可;
当在项目中创建一个build.xml时,这个文件就是ant的生成文件;
六、模式匹配
在Ant中有一些基本的模式匹配的功能,比如:
*表示任意字符串,**表示任意数量的目录;
(1)*.java,表示任意的java文件;
(2)*/*.java表示当前目录的任意java文件;
(3)**/*.java表示当前目录结构下的任意java文件;
<fileset dir=" src ">
<include name="**/*.java"/>
<include name="**/*.txt"/>
<exclude name="**/*Test*"/>
</fileset>
表示包含src目录下的所有java和txt文件,排除文件名包含Test的文件;
举例:将java文件拷贝到dest文件夹下;
[html] view plaincopyprint?
1. <copy todir="dest">
2. <span style="white-space:pre"> </span><fileset dir=".">
3. <span style="white-space:pre"> </span><include name="**/*.java"/>
4. <span style="white-space:pre"> </span></fileset>
5. </copy>
七、自定义任务
自定义任务类似于JSP中的自定义标签;
步骤:
(1)继承org.apache.tools.Task;
(2)覆写public void execute()throws BuildException;
(3)在类中添加的属性即为任务标签的属性;
(4)在build.xml中声明任务<taskdef name=" " classname=" " classpath="bin"/>
举例:复制文件;
[java] view plaincopyprint?
1. package org.tools;
2.
3. import java.io.BufferedReader;
4. import java.io.File;
5. import java.io.FileInputStream;
6. import java.io.FileWriter;
7. import java.io.IOException;
8. import java.io.InputStreamReader;
9. import java.io.PrintWriter;
10.
11. import org.apache.tools.ant.BuildException;
12. import org.apache.tools.ant.Task;
13. public class SimpleTask extends Task{
14. private File file;
15. private File tofile;
16. public File getFile() {
17. return file;
18. }
19. public void setFile(File file) {
20. this.file = file;
21. }
22. public File getTofile() {
23. return tofile;
24. }
25. public void setTofile(File tofile) {
26. this.tofile = tofile;
27. }
28. @Override
29. public void execute() throws BuildException {
30. try {
31. PrintWriter out = new PrintWriter(new FileWriter(tofile));
32. BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
33. String line = null;
34. while((line=in.readLine())!=null){
35. out.println(line);
36. }
37. out.close();
38. in.close();
39. } catch (IOException e) {
40. e.printStackTrace();
41. }
42.
43. }
44.
45. }
build.xml
[html] view plaincopyprint?
1. <taskdef name="MyCopy" classname="org.tools.SimpleTask" classpath="bin"></taskdef>
2. <target name="mycopy">
3. <MyCopy file="2.txt" tofile="output.txt"/>
4. </target>