ANT详解及运行小例子

Apache Ant是一个Java环境下的构建工具,以其跨平台、易用和强大的功能著称。本文介绍了ANT的基本概念,包括project属性、内置属性和target的depends属性。通过一个简单的Hello Ant项目,展示了如何创建build.xml文件并执行任务。此外,还提到了if/unless属性,允许根据特定条件决定target的执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.ANT介绍

1.1 什么是Ant?

Apache Ant 是一个将软件编译、测试、部署等步骤联系在一起加以优化的一个构建工具,常用于Java 环境中的软件开发。

Ant 的默认配置文件是build.xml。

1.2 什么是构建?

形象的说,构建就是把代码从某个地方拿来、编译、再拷贝到某个地方去等操作,当然不仅于此,但是主要用来干这个。

1.3Ant 的优势?

(1)跨平台:因为 ant 是使用 java 实现的,所以跨平台;

(2)使用简单:比其他构建工具简单,特别是和 ant 的兄弟 make 做比较;

(3)语法清晰:同样是和 make 做比较;

(4)功能强大:Ant 能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。当你需要自己开发一些 ant 插件的时候,你会发现它更多的功能。

Ant 于Make 的区别:make 是一个类似于Ant 的构建工具,不过make 应用于C/C++,Ant 则主要应用于java。当然这不是定的,当大部分人如此。

2. 自己写的一个例子

2.1 首先你建个java 项目。就写个Hello ant的小代码就可以了~,这就不说了。

       然后在写一个build.xml文件。具体内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
(1) 建一个src 文件夹,然后写一个HelloWorld.java,按照包结构目录放进去;
(2) 写build.xml 文件
(3) 在命令行输入 cmd, ant 做测试。
-->
<project name="Ant_Testing" default="run" basedir=".">
	<property name="src" value="src"/>
	<property name="dest" value="classes"/>
	<property name="hello_jar" value="hello.jar"/>
	<target name="init">
	 	<mkdir dir="${dest}"/>
	</target>
	<target name="compile" depends="init"> 
		<javac srcdir="${src}" destdir="${dest}"/>
	</target>
	<!-- 打jar 包 -->
	<target name="jar" depends="compile">
		<jar destfile="${hello_jar}" basedir="${dest}"></jar>
	</target>
	<!-- 运行jar 包内的程序-->
	<target name="run" depends="jar">
		<java classname="ant.HelloAnt" classpath="${hello_jar}"/>
	</target>
	<!-- 删除生成文件-->
	<target name="clean">
		<delete dir="${dest}"/>
		<delete file="${hello_jar}"/>
	</target>
	<!-- 再次运行,这里显示了如何在一个 target 里边调用其他的 target -->
	<target name="return" depends="clean,run">
		<ant target="clean"/>
		<ant target="run"/>
	</target>
</project>

ant 中的每一个任务都可以这样执行,ant + target name

3.核心概念详解

3.1 project 属性

AttributeDescriptionRequired
name项目名称,可自由定义。
default定义一个缺省(默认)的target,当我们执行没有指定
target 的build.xml 时,就会执行这个缺省的target。
basedir用于定义项目的基路径。
description表示项目的描述
3.2 property 属性

一个项目可以有很多的property。可以在buildfile 中用property task 来设定,或者在ant 之外设定。一个property 有一个名字和一个值。Property 可以用于task 的属性值。这是通过将属性名放在“${}”之间并放在属性值的位置来实现的。例如有一个property builddir 的值是“build”,这
个property 就可用于属性值:${builddir}/classes。这个值就可被解析为 build/class。
典型的如第一讲中的例子,
首先设定property:
<property name="src" value="src" />
<property name="dest" value="classes" />
然后在其他地方引用property:
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}" />
</target>

3.3 内置属性

除了Java 的内置属性外,Ant 还定义了一些自己的内置属性:

AttributeDescription
basedir可以理解为project 项目的绝对路径,于<project>中的
basedir 属性一样
ant.filebuildfile 的绝对路径
ant.versionant 的版本
ant.propertie.name当前执行的project 的名字,由<project>的name 属性设定
ant.java.versionant 检测到的jvm 版本。

3.4 target 属性

AttributeDescriptionRequired
nametarget 的名字。
depends用逗号分隔的target 的名字列表,也就是依赖列表
if执行target 需要清除设定的属性名
unless执行target 需要清除设定的属性名
description描述target 的功能,这些描述可由-projexthelp 命令行
输出。

3.4.1

depends

target 中的depends 属性指定了target 的执行顺序,也就是说一个target 可以依赖其他的target。Ant 会依照depends 属性中的target 出现顺序依次执行每个target。在执行前,首先需要执行它所依赖的target。例如,有一个用于编译的target,一个用于生成执行文件的target。在生成执行文件之前必须先编译通过,所以生成可执行文件的target 依赖于编译target。Ant 会处理这种依赖关系。我们还要注意到,Ant 的depends 属性只指定了target应该被执行的顺序。如果被依赖的target无法运行,这种 depends 对于指定了依赖关系的其他target 没有影响。Ant 会依照depends 属性中target 出现的顺序依次执行每个target。然而,要记住的是只要某个target 依赖于一个target,后者就会被先执行。看下面的例子。

<target name="A"/>
<target name="B"
depends="A"/>
<target name="C"
depends="B"/>
<target name="D"
depends="C "/>
假设我们默认的target 是D,因为D 依赖于C,
C 依赖于B,B 依赖于A。所以先执行A,再执
行B,然后是C,最后D 被执行。
还可以写为这样的格式: <target name="D" depends="C,B,A"/>,执行顺序和上面的一样。另外,一个target 只能执行一次,即使有多个target 依赖于它,也只执行一次。

2.4.2 if / unless

如果执行某个target,由某些属性是否被设定来决定。这样,就能根据系统的状态(java version,OS, 命令行属性定义等等)来更好的控制build 的过程。要想让一个target 这样做,你就应该在target元素中,加入if 或unless 属性,带上target 应该有所判断的属性。看下面的例子。

<target name="install-windows" if="osfamily-windows">
<target name="install-unix" if="osfamily-unix">
如果没有if 或者else,target 总会被执行。


3.5 task 属性

一个task 是一段可执行的代码。task 可以有多个属性(也可以叫变量)。属性值可能包含对property 的引用。这些应用会在task 执行前被解析。

<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}" />
</target>
其中的<javac srcdir="${src}" destdir="${dest}" /> 就是一个task。
其中的 ${src} 就是对前面定义的property 的引用。再执行javac 之前这些${*}
会被解析。

下面是task 的一般构造形式:
<name attribute1=”value1” attribute2=”value2” … />
这里name 是task 的名字,attribute 是属性名,value 是属性值。

另外,我们可以使用内置的task 和一些可选的task,我们也可以编写自己的task。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值