Ant入门
一、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文件,整体结构为:
- <?xml version="1.0" encoding="GBK"?>
- <project default=" targetname">
- <target name="name">
- </target>
- </project>
<?xml version="1.0" encoding="GBK"?>
<project default=" targetname">
<target name="name">
</target>
</project>
project是生成文件的根元素,表示一个工程;
target是project的子元素,表示一个任务;一个project中可以定义多个target元素,表示多个任务;
default属性表示默认执行的target,如果ant命令没有指定target,则执行default的target;
ant targetname;则会执行此target,而忽略default设置的target;
注意:不能有两个相同的targetname;
代码举例:创建并删除hello目录;
- <?xml version="1.0" encoding="gbk"?>
- <project default="delete">
- <property name="name" value="xiazdong"/>
- <target name="delete" depends="mkdir">
- <delete dir="${name}"/>
- </target>
- <target name="mkdir">
- <mkdir dir="${name}"/>
- </target>
- </project>
<?xml version="1.0" encoding="gbk"?>
<project default="delete">
<property name="name" value="xiazdong"/>
<target name="delete" depends="mkdir">
<delete dir="${name}"/>
</target>
<target name="mkdir">
<mkdir dir="${name}"/>
</target>
</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类,一般形式如下:
<Javaclassname=" " 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结构
- <project default="init">
- <property name="src" value="src"/>
- <property name="classes" value="classes"/>
- <property name="dest" value="dest"/>
- <path id="classpath">
- <pathelement path="${classes}"/>
- </path>
- <target name="help">
- <echo>help -打印帮助信息</echo>
- <echo>compile -编译java源文件</echo>
- <echo>run -运行程序</echo>
- <echo>build -打成jar包</echo>
- <echo>clean -清楚全部编译生成文件</echo>
- </target>
- <target name="compile">
- <delete dir="${classes}"/>
- <mkdir dir="${classes}"/>
- <javac srcdir="${src}" destdir="${classes}"/>
- </target>
- <target name="run" depends="compile">
- <java classname="org.xiazdong.Test" fork="yes">
- <classpath path="${classes}"/>
- </java>
- </target>
- <target name="build" depends="run">
- <delete dir="${dest}"/>
- <mkdir dir="${dest}"/>
- <jar destfile="${dest}/Test.jar" basedir="${classes}">
- <manifest>
- <attribute name="Main-Class" value="org.xiazdong.Test"/>
- </manifest>
- </jar>
- </target>
- <target name="clean">
- <delete dir="${classes}"/>
- <delete dir="${dest}"/>
- </target>
- </project>
<project default="init">
<property name="src" value="src"/>
<property name="classes" value="classes"/>
<property name="dest" value="dest"/>
<path id="classpath">
<pathelement path="${classes}"/>
</path>
<target name="help">
<echo>help -打印帮助信息</echo>
<echo>compile -编译java源文件</echo>
<echo>run -运行程序</echo>
<echo>build -打成jar包</echo>
<echo>clean -清楚全部编译生成文件</echo>
</target>
<target name="compile">
<delete dir="${classes}"/>
<mkdir dir="${classes}"/>
<javac srcdir="${src}" destdir="${classes}"/>
</target>
<target name="run" depends="compile">
<java classname="org.xiazdong.Test" fork="yes">
<classpath path="${classes}"/>
</java>
</target>
<target name="build" depends="run">
<delete dir="${dest}"/>
<mkdir dir="${dest}"/>
<jar destfile="${dest}/Test.jar" basedir="${classes}">
<manifest>
<attribute name="Main-Class" value="org.xiazdong.Test"/>
</manifest>
</jar>
</target>
<target name="clean">
<delete dir="${classes}"/>
<delete dir="${dest}"/>
</target>
</project>
总结一下:
- <?xml version = "1.0" encoding="GBK"?>
- <project name="Test" default="" basedir=".">
- <property name="src" value="${basedir}\src"/>
- <property file="${basedir}\a.properties"/>
- <!--
- path用法
- 1.id属性表示编号,用于被引用
- -->
- <path id="classpath">
- <!--
- pathelement的用法
- 1.path表示多个目录,用“;”隔开目录
- 2.location表示一个目录
- -->
- <pathelement path="lib;src"/>
- <pathelement location="lib"/>
- <!--
- dirset的用法
- 1.dir属性指定根目录
- 2.子元素<include name=" "/>表示包含的目录
- 3.子元素<exclude name=" "/>表示不包含的目录
- -->
- <dirset dir="lib">
- <include name="**/*Test*"/>
- <exclude name="**/class"/>
- </dirset>
- <!--
- filelist的用法
- 1.dir属性指定根路径
- 2.files属性指定文件名的列表,用","隔开
- -->
- <filelist dir="lib" files="a.xml,b.xml"/>
- <!--
- fileset用法
- 1.dir属性指出根路径
- 2.子元素<include name=" "/>指定包含的文件名
- -->
- <fileset dir="lib">
- <include name="**/*.jar"/>
- </fileset>
- </path>
- <!--
- target用法
- 1.表示任务,子元素为各种task的集合;
- -->
- <target name="target1">
- <!--
- javac用法
- 1.srcdir表示java文件的目录
- 2.destdir表示class文件的保存目录
- -->
- <javac srcdir="src" destdir="bin">
- <!--
- classpath用法
- 1.refid引用前面的path指定的路径
- -->
- <classpath refid="classpath"/>
- </javac>
- <!--
- java用法
- 1.classname表示要运行的类
- 2.fork="yes"一定要写上!!
- -->
- <java classname="Test" fork="yes">
- <classpath refid="classpath"/>
- <!--
- arg表示指定的参数
- -->
- <arg value="a b c"/>
- </java>
- <!--
- echo表示输出
- -->
- <echo>Hello world</echo>
- <!--
- copy表示复制文件
- delete表示删除文件
- mkdir表示创建目录
- move表示移动文件
- -->
- <copy file="src.txt" tofile="dest.txt"/>
- <delete dir="src"/>
- <mkdir dir="src"/>
- <move file="src.txt" tofile="dest.txt"/>
- </target>
- </project>
<?xml version = "1.0" encoding="GBK"?>
<project name="Test" default="" basedir=".">
<property name="src" value="${basedir}\src"/>
<property file="${basedir}\a.properties"/>
<!--
path用法
1.id属性表示编号,用于被引用
-->
<path id="classpath">
<!--
pathelement的用法
1.path表示多个目录,用“;”隔开目录
2.location表示一个目录
-->
<pathelement path="lib;src"/>
<pathelement location="lib"/>
<!--
dirset的用法
1.dir属性指定根目录
2.子元素<include name=" "/>表示包含的目录
3.子元素<exclude name=" "/>表示不包含的目录
-->
<dirset dir="lib">
<include name="**/*Test*"/>
<exclude name="**/class"/>
</dirset>
<!--
filelist的用法
1.dir属性指定根路径
2.files属性指定文件名的列表,用","隔开
-->
<filelist dir="lib" files="a.xml,b.xml"/>
<!--
fileset用法
1.dir属性指出根路径
2.子元素<include name=" "/>指定包含的文件名
-->
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
</path>
<!--
target用法
1.表示任务,子元素为各种task的集合;
-->
<target name="target1">
<!--
javac用法
1.srcdir表示java文件的目录
2.destdir表示class文件的保存目录
-->
<javac srcdir="src" destdir="bin">
<!--
classpath用法
1.refid引用前面的path指定的路径
-->
<classpath refid="classpath"/>
</javac>
<!--
java用法
1.classname表示要运行的类
2.fork="yes"一定要写上!!
-->
<java classname="Test" fork="yes">
<classpath refid="classpath"/>
<!--
arg表示指定的参数
-->
<arg value="a b c"/>
</java>
<!--
echo表示输出
-->
<echo>Hello world</echo>
<!--
copy表示复制文件
delete表示删除文件
mkdir表示创建目录
move表示移动文件
-->
<copy file="src.txt" tofile="dest.txt"/>
<delete dir="src"/>
<mkdir dir="src"/>
<move file="src.txt" tofile="dest.txt"/>
</target>
</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文件夹下;
- <copy todir="dest">
- <span style="white-space:pre"> </span><fileset dir=".">
- <span style="white-space:pre"> </span><include name="**/*.java"/>
- <span style="white-space:pre"> </span></fileset>
- </copy>
<copy todir="dest">
<fileset dir=".">
<include name="**/*.java"/>
</fileset>
</copy>
七、自定义任务
自定义任务类似于JSP中的自定义标签;
步骤:
(1)继承org.apache.tools.Task;
(2)覆写public void execute()throws BuildException;
(3)在类中添加的属性即为任务标签的属性;
(4)在build.xml中声明任务<taskdef name=" " classname=" " classpath="bin"/>
举例:复制文件;
- package org.tools;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import org.apache.tools.ant.BuildException;
- import org.apache.tools.ant.Task;
- public class SimpleTask extends Task{
- private File file;
- private File tofile;
- public File getFile() {
- return file;
- }
- public void setFile(File file) {
- this.file = file;
- }
- public File getTofile() {
- return tofile;
- }
- public void setTofile(File tofile) {
- this.tofile = tofile;
- }
- @Override
- public void execute() throws BuildException {
- try {
- PrintWriter out = new PrintWriter(new FileWriter(tofile));
- BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
- String line = null;
- while((line=in.readLine())!=null){
- out.println(line);
- }
- out.close();
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
package org.tools;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
public class SimpleTask extends Task{
private File file;
private File tofile;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public File getTofile() {
return tofile;
}
public void setTofile(File tofile) {
this.tofile = tofile;
}
@Override
public void execute() throws BuildException {
try {
PrintWriter out = new PrintWriter(new FileWriter(tofile));
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line = null;
while((line=in.readLine())!=null){
out.println(line);
}
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
build.xml
- <taskdef name="MyCopy" classname="org.tools.SimpleTask" classpath="bin"></taskdef>
- <target name="mycopy">
- <MyCopy file="2.txt" tofile="output.txt"/>
- </target>
<taskdef name="MyCopy" classname="org.tools.SimpleTask" classpath="bin"></taskdef>
<target name="mycopy">
<MyCopy file="2.txt" tofile="output.txt"/>
</target>
Ant入门的更多相关文章
- ant入门程序
一. ant简单介绍 Ant是apache的一个核心项目, 它的作用是项目自己主动化构建, 由于它内置了Javac.Java.创建文件夹.拷贝文件等功能, 直接执行build.xml文件就能够编译我们 ...
- ANT入门&用ANT编译java项目
第一次接触ant是15年在无锡某软件公司实习时,当时的项目是由多个模块组成,开发分成模块开发的几个小组.为了提高开发效率,采用这种编译项目的方法. 最近接触到flex项目,采用eclipse自动编译的 ...
- Ant 入门
参考: Ant官网 http://ant.apache.org/ 轻量级java ee企业应用实战(李刚) Ant当前版本1.9.6 Ant基于Java 配置环境变 ...
- Ant:Ant 入门
背景 自从有了 Maven 以后,Ant 视乎就不流行了,不过 Ant 还是有其应用场景的,Ant 的思想比较简洁,如下: 一个 project 包含多个 target(类似成员方法). 一个 tar ...
- Ant入门使用说明
一.概述 ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.在实际软件开发中,有很多地方可以用到ant. 开发环境: 复制代码 代码如下: S ...
- Ant入门之引用外部jar文件
笔者在java项目开发中经常遇到引用外部Jar包的情况,使用ant打包过程中需要对其引用.现在此简单记忆以飨来者. 此处引用Log4j,具体程序HelloLog4j.java: package oat ...
- Ant入门: Hello World with Apache Ant
笔者因项目需要进行java程序打包,之前一直使用的最多的打包工具要数fat-jar了.此工具将所有引用的jar包以及源码生成的class一起打到一个包里面,运行程序的时候直接运行命令:java –ja ...
- 《Ant权威指南》笔记(一)
Ant的由来(序) James Duncan Davidson当年用纯Java开发Tomcat的时候,不仅想让它跨平台运行,还想要在不同的操作系统上都能够进行开发和构建.这种较大的项目的编译构建过程是 ...
- (转载)Ant教程
ant教程(一) 写在所有之前 为了减少阅读的厌烦,我会使用尽量少的文字,尽量明白的表达我的意思,尽我所能吧.作为一个学习者,在我的文章中会存在各种问题,希望热心人指正.目录大概是这样 ant教程 ( ...
随机推荐
- 【穿插】Python基础之文件、文件夹的创建,对上一期代码进行优化
在上一期妹子图的爬虫教程中,我们将图片都保存在了代码当前目录下,这样并不便于浏览,我们应该将同一个模特的图片都放在一个文件夹中. 今天我们就简单讲一下Python下如何创建文件.文件夹,今后就可以用上 ...
- B - Catch That Cow (抓牛)
B - Catch That Cow Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- Log4j将不同Package的日志输出到不同的文件
转自:http://www.crazyant.net/1931.html 随着项目规模的越来越大,会不断的引入新的模块,不同的模块都会打印自己的日志,最后就造成日志根本没法查看,比如我自己的项目中,就 ...
- asp.net mvc4连接mysql
环境:vs2013+mysql5.6+mysql connector for .net 6.8.3+MySQL for Visual Studio 1.1.3 参考:http://dev.mysql. ...
- xenserver 模板导出导入
由于业务需求,新增一台xenserver,需要将原先创建好的模板环境导入到新的母机上面,此处记录一下 1.导出模板 # 获取需要导出的模板uuid [root@localhost ~]# xe tem ...
- Python里面如何拷贝一个对象?
import copy lst=[1,2,3,4,[1,2]] # 复制列表lst,命名lst2 lst2=copy.copy(lst) print(f'这是lst3:{lst2}') # 深拷贝 l ...
- Linux中的流程控制语句
if语句 if [ 条件判断式 ] then 程序elif [ 条件判断式 ] then 程序else 程序fi 注意: a.使用fi结尾 b.条件判断式和中括号之间需要有空格 [root@local ...
- springboot添加对listener,servlet,filter的支持
比较常用的方式就是使用注解来添加对 监听器,过滤器,servlet的支持. 1.首先在启动类上添加 @ServletComponentScan 开启 对监听器,过滤器,servlet的注解扫描. ...
- Amend Last Commit选项使用注意点
1.创建master分支并上传到remote分支 create 2 folders and 4 files 2.修改folder1/file1.java,commit并push. 3.修改folder ...
- Django组件 用户认证,form
auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码 ...