小白关于Ant的使用

关于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上创建文件和写入读取数据。

关于ant的内容参考:https://www.cnblogs.com/Donnnnnn/p/7498224.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值