关于Ant的简介:
是一个用于简单或复杂Java工程的自动化构建,部署工具。使用java开发,通过xml存储build信息,因此跨平台。
Ant可以代替使用javac,java和jar等命令来执行java操作,从而达到轻松的构建和部署java工程。
下载部署
下载地址http://ant.apache.org/bindownload.cgi
复制下载链接,通过wget 命令下载到Centos7上去
wget http://mirrors.tuna.tsinghua.edu.cn/apache//ant/binaries/apache-ant-1.10.5-bin.tar.gz
tar -zxvf apache-ant-1.10.5-bin.tar.gz # 解压
配置环境变量 /etc/profile
#ant-1.10.5
export ANT_HOME=/usr/local/ant-1.10.5
export PATH=$ANT_HOME/bin:$PATH
使环境变量生效: source /etc/profile
ant -version # 查看ant版本
出现ant的版本信息则表示环境变量是正确的。
Ant关键元素
Ant的构建文件是基于xml编写的,默认名称为build.xml。为了更清楚的了解Ant,这里编写一个简单的Ant程序,展示Ant的功能,这里我在root用户的home目录下创建一个build.xml文件,内容如下所示:
<project name="helloWorld">
<target name="sayHelloWorld">
<echo message="Hello, Ant" />
</target>
</project>
然后在home目录下执行 ant sayHelloWorld,输出的结果如下图所示:
下面开始介绍下Ant的关键元素,project,target,property,task
project元素
project元素是Ant构建文件的根元素,Ant构建文件至少应该包含一个project元素,否则会发生错误。在每个project元素下,可以包含多个target元素,下面介绍project元素的属性。
1.name属性
用于指定project元素的名称。
2.default属性
用于指定project默认执行时 所执行的target的名称。
3.basedir属性
用于指定基路径的位置,如果该属性没有指定(一般都需要指定),使用Ant的构建文件的附属目录(build.xml所在目录)作为准基目录。
例如,修改第一个案例的内容如下
<project name="helloWorld" default="sayHelloWorld" basedir=".">
<target name="sayHelloWorld">
<echo message="Hello, Ant ${basedir}" />
</target>
</project>
然后直接执行 ant命令,没有指定target名字,结果如下图所示:
从上面的内容我们可以看出,在这里定义了default属性的值为sayHelloWorld,即 当运行ant命令时,若未指明执行的target时,默认执行的target的sayHelloWorld,同时还定义了basedir属性的值为当前目录 ( . 代表当前目录 )
target元素
target是Ant的基本执行单元,它可以包含一个或多个具体的任务,多个target可以存在相互依赖关系。属性如下:
1.name属性
指定target元素的名称,这个属性在一个project元素中是唯一的。我们可以通过指定target元素的名称来指定某个target。
2.depends属性
用于描述target之间的依赖关系,多个target存在依赖关系时,需要以 " , " 间隔,Ant会依照depends属性中target出现的顺序依次执行每个target,被依赖的target会先执行。
3.if属性
用于验证指定的属性是否存在,如果不存在,所在的target则不会执行。
4.unless属性
该属性功能与if属性的功能正好相反,它用于验证指定的属性是否存在,如果不存在,所在target会被执行
案例,修改之前的build.xml的内容如下:
<project name="targetTest" >
<target name="targetA">
<echo message="Java Version: ${ant.java.version}" />
</target>
<!--这里使用unless指定了一个不存在的aa属性,所以targetB会被执行-->
<target name="targetB" depends="targetA" unless="aa">
<description>描述标签</description>
<echo message="The base dir is: ${basedir}" />
</target>
</project>
执行结果如下,targetB依赖targetA所以会先执行targetA
property元素
property元素可看作参量或者参数的定义,project的属性可以通过property元素来设定,也可在Ant之外设定。若要在外部引入某文件,例如build.properties文件,可以通过如下内容将其引入:<property file=”build.properties”/>
property元素可以用作task的属性值。在task中通过将属性名放在 ${ } 括号间, 并放在task属性值的位置来实现。
Ant提供了一些内置的属性,它能得到的系统属性的列表与Java文档中System.getPropertis()方法得到的属性一致
同时,Ant还提供了一些它自己的内置属性,如下:
basedir:project基目录的绝对路径,该属性在讲解project元素时有详细说明;
ant.file:buildfile的绝对路径,如上面的各例子中,ant.file的值为/root/build.xml;
ant.version:Ant的版本,在本文中,值为1.10.5;
ant.project.name:当前指定的project的名字,即前文说到的project的name属性的值;
ant.java.version:Ant检测到的JDK的版本,在上例运行结果中可看到为1.8
关于property元素的使用案例,修改build.xml的内容如下:
<project name="propertyTest" default="example" >
<!--设置属性name,值为 小白,其中的value换成location也行-->
<property name="name" value="小白" />
<property name="age" value="18" />
<target name="example">
<!--通过 ${name} 的方法输出属性name的值-->
<echo message="name: ${name}, age=${age}" />
</target>
</project>
执行结果如下所示:
Ant的常用任务
1.copy任务
该任务主要用来对文件和目录的复制功能。举例如下:
1.1 复制单个文件:
<copy file="file.txt" tofile="copy.txt"/>
1.2对文件目录进行复制:
<copy todir="../newdir/dest_dir">
<fileset dir="src_dir"/>
</copy>
1.3将文件复制到另外的目录:
<copy file="file.txt" todir="../other/dir"/>
2.delete任务
对文件或目录进行删除,举例如下:
2.1 删除某个文件:<delete file="photo/amigo.jpg"/>
2.2 删除某个目录:<delete dir="photo"/>
2.3 删除所有的备份目录或空目录:
includeEmptyDirs属性为true表示包括删除为空目录
<delete includeEmptyDirs="true">
<fileset dir="." includes="**/*.bak"/>
</delete>
3.mkdir任务
创建目录:<mkdir dir="build"/>
4.move任务
移动文件或目录,举例如下:
4.1 移动单个文件:
<move file="fromfile" tofile=”tofile”/>
4.2 移动单个文件到另一个目录:
<move file="fromfile" todir=”movedir”/>
4.3 移动某个目录到另一个目录:
<move todir="newdir">
<fileset dir="olddir"/>
</move>
5.echo任务
这个在前面案例中都有使用过,它包括message、file、append和level四个属性,举例如下:
<echo message="Hello,Amigo" file="logs/system.log" append="true">
大概意思就是将 message的内容 添加到logs/system.log里面
从Hadoop DFS读取和写入文件的简单示例
案例地址:https://wiki.apache.org/hadoop/HadoopDfsReadWriteExample
文件目录如下图所示,.java文件在src目录下,build.xml与src同目录
build.xml文件内容如下:
<project name="HDFSJavaAPI" default="compile" basedir=".">
<property name="build" location="build" />
<property environment="env"/>
<path id="hadoop-classpath">
<fileset dir="${env.HADOOP_HOME}/lib">
<include name="**/*.jar" />
</fileset>
<fileset dir="${env.HADOOP_HOME}">
<include name="**/*.jar" />
</fileset>
</path>
<target name="compile">
<mkdir dir="${build}" />
<!---javac,编译,对应java中的javac命令-->
<javac includeantruntime="false" srcdir="src" destdir="${build}">
<classpath refid="hadoop-classpath"/>
</javac>
<!--jar操作,jarfile指定jar包存放路径,basedir为编译后的class的目录-->
<jar jarfile="HDFSJavaAPI.jar" basedir="${build}" />
</target>
<target name="clean">
<delete dir="${build}" />
</target>
<target name="print-cp">
<property name="classpath" refid="hadoop-classpath"/>
<echo message="classpath= ${classpath}"/>
</target>
</project>
HDFSJavaAPIDemo.java文件内容如下,功能是 从Hadoop DFS读取和写入文件(demo.txt)
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/* This sample demostrate use of HDFS Java API
* This sample is loosely based on the
* http://wiki.apache.org/hadoop/HadoopDfsReadWriteExample
*/
public class HDFSJavaAPIDemo {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
conf.addResource(new Path(
"/usr/local/hadoop/etc/hadoop/core-site.xml"));
conf.addResource(new Path(
"/usr/local/hadoop/etc/hadoop/hdfs-site.xml"));
FileSystem fileSystem = FileSystem.get(conf);
//输出主机和端口
System.out.println(fileSystem.getUri());
Path file = new Path("demo.txt");
//判断hdfs中demo文件是否存
if (fileSystem.exists(file)) {
System.out.println("File exists.");
} else {
// 如果文件不存在,则创建,写入Welcome to HDFS Java API!!!内容到demo.txt
FSDataOutputStream outStream = fileSystem.create(file);
outStream.writeUTF("Welcome to HDFS Java API!!!");
outStream.close();
}
// 读取该文件的内容,输出
FSDataInputStream inStream = fileSystem.open(file);
String data = inStream.readUTF();
System.out.println(data);
inStream.close();
// deleting the file. Non-recursively.
// fileSystem.delete(file, false);
fileSystem.close();
}
}
在该目录下直接执行ant目录,ant会自动找到该目录的下build.xml文件,根据build.xml内容创建工程,ant应该是根据最近的build.xml文件执行,执行结果如下所示
查看目录结构,多了build文件夹,HDFSJavaAPI.jar文件
此时查看hdfs里面的文件如下所示:
执行 hadoop jar HDFSJavaAPI.jar HDFSJavaAPIDemo,HDFSJavaAPIDemo是那个java文件的名称
然后再查看hdfs的文件,多了个demo.txt文件,内容是 Welcome to HDFS Java API!!!,通过java api 在 hdfs上创建文件和写入读取数据。