- 浏览: 375808 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ytlviv:
利器深藏之而不用,非常时方现光芒
[JMX一步步来] 4、动态MBean:DynamicMBean -
fantaxy025025:
总结的不错!搜藏了。原有的链接里面内容css有问题。辛苦楼主! ...
[JMX一步步来] 1、JMX的Hello World(转) -
xuyb_0314:
非常不错~~
查看ORACLE表空间使用情况的SQL语句 -
elan1986:
谢谢 在你这里找到了
在winxp下使用bat文件运行java程序而不弹出dos窗口 -
lqw8668:
...
XP SP2下安装Rose 出现 “MEM_BAD_POINTER”错误的解决方法
了解 Ant 1.6 的新特性以及它们如何影响您组织编译过程的方式。
虽然 Ant 版本的 1.5.x 系列在任务级方面有很大的改善,但它没有改变人们使用 Ant 的方式。而 Ant 1.6 却有所不同。它增加了几个新特性,以支持大型或非常复杂的编译情况。但是,要充分利用它们的功能,用户可能需要稍微调整它们的编译过程。
本文重点介绍了其中的三种新特性 — <macrodef>、<import>、<subant> 任务,表明使用它们可以有什么收获,以及它们如何影响您组织编译设置的方式。
宏
大多数编译工程师迟早会面临必须执行相同的任务组合但在几个地方配置稍微有点不同的情况。一个常见的例子是创建一个web 应用程序存档,对于开发系统、测试系统和生产系统有着不同的配置。
让我们假设 web 应用程序拥有依赖于目标系统的不同的 web 部署描述符,并为开发环境使用了一个不同的 JSP 集合以及一个不同的资料库集合。配置信息将放在属性中,创建 web 存档的任务看起来将类似于
<target name="war" depends="jar"> <war destfile="${war.name}" webxml="${web.xml}"> <lib refid="support-libraries"/> <lib file="${jar.name}"/> <fileset dir="${jsps}"/> </war> </target>
其中 support-libraries 是引用一个在其它位置定义的 <fileset> ,该引用指向您的应用程序所需的附加资料库的一个公共集合。
如果您只想一次创建一个 web 存档,那么您只需要正确地设置属性。比如说,您可以从一个您的目标专有的属性文件中加载它们。
利用 Ant 1.5 创建存档
现在,假定您想为测试系统和生产系统同时创建存档,以确保您真正为两个系统打包了相同的应用程序。利用 Ant 1.5,您可能使用 <antcall> 来调用拥有不同属性设置的 "war" 目标,类似:
<target name="production-wars"> <antcall target="war"> <param name="war.name" value="${staging.war.name}"/> <param name="web.xml" value="${staging.web.xml}"/> </antcall> <antcall target="war"> <param name="war.name" value="${production.war.name}"/> <param name="web.xml" value="${production.web.xml}"/> </antcall> </target>
当然,这假定两个目标系统都将使用相同的 jar 和 JSP。
但这种方法有一个主要缺点 — 就是速度慢。 <antcall> 重新分析编译文件,并为每一次调用重新运行调用的目标所依赖的所有目标。在上面的例子中,"jar" 目标将被运行两次。我们希望这对第二次调用没有影响,因为 "war" 目标依赖于它。
利用 Ant 1.6 创建存档
使用 Ant 1.6,您可以忘掉用 <antcall> 来实现宏的方法,相反您可以通过参数化现有的任务来创建一个新的任务。因而上面的例子将变为:
<macrodef name="makewar"> <attribute name="webxml"/> <attribute name="destfile"/> <sequential> <war destfile="@{destfile}" webxml="@{webxml}"> <lib refid="support-libraries"/> <lib file="${jar.name}"/> <fileset dir="${jsps}"/> </war> </sequential> </macrodef>
这定义了一个名称为 makewar 的任务,该任务可以和任何其它的任务一样使用。该任务有两个必需的属性,webxml 和 destfile。要使属性可选,我们必需在任务定义中提供一个默认值。这个示例假定 ${jar.name} 和 ${jsps} 在编译期间为常量,从而它们仍然作为属性指定。注意,属性在使用任务时展开而不是在定义宏的地方展开。
所用任务的特性几乎完全和属性一样,它们通过 @{} 而不是 ${} 展开。与属性不同,它们是可变的,也就是说,它们的值可以(并将)随着每一次调用而改变。它们也只在您的宏定义程序块内部可用。这意味着如果您的宏定义还包含了另一个定义了宏的任务,那么您内部的宏将看不到包含的宏的属性。
于是新的 production-wars 目标将类似于:
<target name="production-wars"> <makewar destfile="${staging.war.name}" webxml="${staging.web.xml}"/> <makewar destfile="${production.war.name}" webxml="${production.web.xml}"/> </target>
这个新的代码段不仅执行得快一些,而且也更易读,因为属性名称提供了更多的信息。
宏任务还可以定义嵌套的元素。<makewar> 定义中的 <war> 任务的嵌套 <fileset> 可以是这种嵌套元素的一种。可能开发目标需要一些额外的文件或想从不同的位置中挑选 JSP 或资源。以下代码段将一个可选的嵌套 <morefiles> 元素添加到了 <makewar> 任务中
<macrodef name="makewar"> <attribute name="webxml"/> <attribute name="destfile"/> <element name="morefiles" optional="true"/> <sequential> <war destfile="@{destfile}" webxml="@{webxml}"> <lib refid="support-libraries"/> <lib file="${jar.name}"/> <fileset dir="${jsps}"/> <morefiles/> </war> </sequential> </macrodef>
调用将类似于:
<makewar destfile="${development.war.name}" webxml="${development.web.xml}"> <morefiles> <fileset dir="${development.resources}"/> <lib refid="development-support-libraries"/> </morefiles> </makewar>
这就像 <morefiles> 的嵌套元素直接在 <war> 任务内部使用的效果一样。
即使迄今为止的示例仅显示了包装单个任务的 <macrodef>,但它不限于此。
下面的宏不仅将创建 web 存档,还将确保包含最终存档的目录在试图写入之前存在。在一个实际的编译文件中,您可能在调用任务之前使用一个设置目标来完成这个操作。
<macrodef name="makewar"> <attribute name="webxml"/> <attribute name="destfile"/> <element name="morefiles" optional="true"/> <sequential> <dirname property="@{destfile}.parent" file="@{destfile}"/> <mkdir dir="${@{destfile}.parent}"/> <war destfile="@{destfile}" webxml="@{webxml}"> <lib refid="support-libraries"/> <lib file="${jar.name}"/> <fileset dir="${jsps}"/> <morefiles/> </war> </sequential> </macrodef>
这里注意两件事情:
首先,特性在属性展开之前展开,因此结构 ${@{destfile}.parent} 将展开一个名称包含了 destfile 特性的值和 ".parent" 后缀的属性。这意味着您可以将特性展开嵌入到属性展开中,而不是将属性展开嵌入特性展开中。
其次,这个宏定义了属性,该属性的名称基于一个特性的值,因为 Ant 中的属性是全局的并且不可改变。第一次尝试使用
<dirname property="parent" file="@{destfile}"/>
相反将不会在 "production-wars" 目标中的第二次 <makewar> 调用产生期望的结果。第一次调用将定义一个新的名称为 parent 的属性,该属性指向父目录 ${staging.war.name}。第二次调用将查看这个属性但不会修改它的值。
预期 Ant 未来的版本将支持某些类型的限定范围的属性,这种属性只在宏执行期间定义。在此之前,使用特性的名称来构建属性名称是一种变通办法,潜在的副作用是要创建大量的属性。
提示: 如果您查看您的编译文件时发现使用了 <antcall> 代替宏,那么强烈建议您考虑使用 macrodef 将其转换成真正的宏。性能影响可能非常显著,并且还可能产生更易读和更易于维护的编译文件。 |
将一个编译文件分成多个文件有几个原因。
- 文件可能变得太大,需要分成几个单独的部分,以便更易于维护。
- 您有某个功能集是多个编译文件公用的,您想共享它。
共享公用功能/在 Ant 1.6 之前包含文件
在 Ant 1.6 之前,您唯一的选择是实体包含的 XML 方法,类似于:
<!DOCTYPE project [ <!ENTITY common SYSTEM "file:./common.xml"> ]> <project name="test" default="test" basedir="."> <target name="setup"> ... </target> &common; ... </project>
摘自 Ant 常见问题解答。
这种方法有两个主要的缺点。您不能使用 Ant 属性指向您想包含的文件,因此被迫在您的编译文件中对位置进行硬编码。您想包含的文件只是一个 XML 文件的一部分,它可能没有一个根元素,因而使用支持 XML 的工具进行维护更加困难。
共享公用功能/使用 Ant 1.6 包含文件
Ant 1.6 自带了一个名称为 import 的新任务,您现在可以使用它。上面的示例将变为
<project name="test" default="test" basedir="."> <target name="setup"> ... </target> <import file="common.xml"/> ... </project>
因为它是一个任务,因此您可以使用 Ant 所有的特性来指定文件位置。主要的差异是被导入的文件本身必须是一个有效的 Ant 编译文件,因而必须有一个名称为 project 的根元素。如果您想从实体包含转换到导入,那么您必须在导入的文件的内容首尾放上 <project> 标记;然后 Ant 将在读取文件时再次划分它们。
注意文件名称由 Ant 任务根据编译文件的位置(而不是指定的基本目录)确定。如果您没有设置项目的 basedir 属性或将其设为 ".",那么您将不会注意到任何差异。如果您需要根据基本目录解析一个文件,那么您可以使用一个属性作为变通办法,类似于:
<property name="common.location" location="common.xml"/> <import file="${common.location}"/>
属性 common.location 将包含文件 common.xml 的绝对路径,并已根据导入项目的基本目录解析。
使用 Ant 1.6,所有的任务都可能放在目标之外或之内,除了两个例外。 <import> 一定不能嵌入到目标中, <antcall> 一定不能在目标外使用(否则它将创建一个无限循环)。
而 <import> 可做的不仅仅是导入另一个文件。
首先,它定义了名称为 ant.file.NAME 的特殊属性,其中 NAME 替换为每一个导入文件的 <project> 标记的名称属性。这个属性包含了导入文件的绝对路径,导入文件可用来根据它自己的位置(而不是导入文件的基本目录)定位文件和资源。
这意味着 <project> 的名称属性在 <import> 任务环境中变得更加重要。它还用来为在被导入的编译文件中定义的目标提供别名。如果导入了以下文件
<project name="share"> <target name="setup"> <mkdir dir="${dest}"/> </target> </project>
导入编译文件可以查看作为 "setup" 或 "share.setup" 的目标。后者在目标覆盖的上下文中变得非常重要。
让我们假定有一个包含了多个独立的组件(每个组件拥有它自己的编译文件)的编译系统。这些编译文件几乎相同,因此我们决定将公用功能转移到一个共享和已导入的文件中。为了简单起见,我们只介绍 Java 文件的编译和创建结果的一个 JAR 存档。共享的文件将类似于
<project name="share"> <target name="setup" depends="set-properties"> <mkdir dir="${dest}/classes"/> <mkdir dir="${dest}/lib"/> </target> <target name="compile" depends="setup"> <javac srcdir="${src}" destdir="${dest}/classes"> <classpath refid="compile-classpath"/> </javac> </target> <target name="jar" depends="compile"> <jar destfile="${dest}/lib/${jar.name}" basedir="${dest}/classes"/> </target> </project>
这个文件不会作为一个独立的 Ant 编译文件进行工作,因为它没有定义 "setup" 所依赖的 "set-properties" 目标。
组件 A 的编译文件可能类似于
<project name="A" default="jar"> <target name="set-properties"> <property name="dest" location="../dest/A"/> <property name="src" location="src"/> <property name="jar.name" value="module-A.jar"/> <path id="compile-classpath"/> </target> <import file="../share.xml"/> </project>
它仅设置适当的环境,然后将全部的编译逻辑交给被导入的文件负责。注意该编译文件创建了一个空的路径作为编译 CLASSPATH,因为它是自包含的。模块 B 依赖于 A,它的编译文件将类似于
<project name="B" default="jar"> <target name="set-properties"> <property name="dest" location="../dest/B"/> <property name="src" location="src"/> <property name="jar.name" value="module-B.jar"/> <path id="compile-classpath"> <pathelement location="../dest/A/module-A.jar"/> </path> </target> <import file="../share.xml"/> </project>
您将注意到该编译文件与 A 的编译文件几乎一样,因此似乎有可能将大多数的 set-properties 目标也推送到 shared.xml 中。实际上,我们可以假定有一个对 dest 和 src 目标一致的命名惯例,以实现这一目的。
<project name="share"> <target name="set-properties"> <property name="dest" location="../dest/${ant.project.name}"/> <property name="src" location="src"/> <property name="jar.name" value="module-${ant.project.name}.jar"/> </target> ... contents of first example above ... </project>
ant.project.name 是一个内置的属性,它包含了最外面的 <project> 标记的名称属性的值。因此,如果模块 A 的编译文件导入了 share.xml,那么它将拥有值 A。
注意,所有的文件都与导入编译文件的基本目录相关,因此 scr 属性的实际值依赖于导入文件。
为此,A 的编译文件将简单地变为
<project name="A" default="jar"> <path id="compile-classpath"/> <import file="../share.xml"/> </project>
B 的编译文件将变为
<project name="B" default="jar"> <path id="compile-classpath"> <pathelement location="../dest/A/module-A.jar"/> </path> <import file="../share.xml"/> </project>
现在假定 B 增加了一些 RMI 接口,需要在编译类之后但在创建 jar 之前运行 <rmic>。这就是目标覆盖能派上用场的地方。如果我们在导入编译文件中定义了一个目标,该目标与被导入的编译文件中的一个目标名称相同, 那么将使用导入编译文件中的目标。例如,B 可以使用:
<project name="B" default="jar"> <path id="compile-classpath"> <pathelement location="../dest/A/module-A.jar"/> </path> <import file="../share.xml"/> <target name="compile" depends="setup"> <javac srcdir="${src}" destdir="${dest}/classes"> <classpath refid="compile-classpath"/> </javac> <rmic base="${dest}/classes" includes="**/Remote*.class"/> </target> </project>
在上面的示例中将使用 "compile" 目标,而不是 share.xml 中的目标;然而,不幸的是,这只是从共享那里复制 <javac> 任务。一种更好的解决方案是:
<project name="B" default="jar"> <path id="compile-classpath"> <pathelement location="../dest/A/module-A.jar"/> </path> <import file="../share.xml"/> <target name="compile" depends="share.compile"> <rmic base="${dest}/classes" includes="**/Remote*.class"/> </target> </project>
这只是使 B 的 "compile" 在原来的 "compile" 目标使用之后运行 <rmic>。
如果我们想在编译之前生成一些 Java 源代码(例如通过 XDoclet),我们可以使用类似下面的方法:
<import file="../share.xml"/> <target name="compile" depends="setup,xdoclet,share.compile"/> <target name="xdoclet"> .. details of XDoclet invocation omitted .. </target>
因此您可以完全覆盖一个目标或通过在原始目标之前或之后运行任务来增强它。
这里要注意一个危险。目标覆盖机制使导入编译文件依赖于在导入文件中使用的名称属性。如果任何人修改了导入文件的名称属性,那么导入编译文件将被破坏。Ant 开发社区目前正在讨论在 Ant 的一个未来的版本中为此提供一个解决方案。
提示: 如果您在编译文件中发现了非常常见的结构,那么值得尝试将文件重构为一个(一些)共享文件,并在必要时使用目标覆盖。这可以使您的编译系统更加一致,并让您能够重用编译逻辑。 |
在某种意义上,subant 是两种任务合二为一,因为它了解操作的两种模式。
如果您使用 <subant> 的 genericantfile 属性,那么它的工作方式和 <antcall> 一样,调用包含任务的同一个编译文件中的目标。与 <antcall> 不同,<subant> 获取目录的列表或集合,并将为每一个目录调用一次目标,以设定项目的基本目录。如果您想在任意数量的目录中执行完全一样的操作,那么这非常有用。
第二种模式不使用 genericantfile 属性,而获取一个编译文件的列表和集合进行迭代,以在每一个编译文件中调用目标。这种工作方式类似于在一个循环中使用 <ant> 任务。
第二种形式的典型情景是几个能够独立编译的模块的一个编译系统,但是该系统需要一个主编译文件来一次性编译所有的模块。
接下来的步骤
使用以下资源了解关于 Ant 的更多信息,并开始编译和部署 Java 项目。 Ant 业界趋势
阅读关于 JDeveloper 中的 Ant 集成的更多信息
下载 Oracle JDeveloper 10g
测试驱动:将 Ant 用于编译
Ant 入门第 1 部分
Ant 入门第 2 部分
在 Linux 上创建 Java 应用程序的命令行方法
阅读关于 Ant 的更多信息
相关文章与下载 |
在 Ant 1.6 之前构建主编译文件
在导入部分中讨论的例子使用了这样一个主编译文件。
<target name="build-all"> <ant dir="module-A" target="jar"/> <ant dir="module-B" target="jar"/> </target>
在 Ant 1.6 之前的 Ant 中。
使用 Ant 1.6 构建主编译文件
在 Ant 1.6 中使用 <subant>,这可以重写为
<target name="build-all"> <subant target="jar"> <filelist dir="."> <file name="module-A/build.xml"/> <file name="module-B/build.xml"/> </filelist> </subant> </target>
这看起来并没有很大的改善,因为您仍然必须单独指定每一个子编译文件。相反如果您转用 <fileset>,那么情况将有所改观。
<target name="build-all"> <subant target="jar"> <fileset dir="." includes="module-*/build.xml"/> </subant> </target>
这将自动发现所有模块的编译文件。如果您增加了一个模块 C,主编译文件中的目标不需要修改。
但小心。与 <filelist> 或 <path>(也被 <subant> 支持)不同,<fileset> 是无序的。在我们的例子中,模块 B 依赖于模块 A,因此我们需要确保首先编译模块 A,而使用 <fileset> 没有办法这么做。
如果编译完全彼此独立或者它们对于一个给定的操作彼此独立,那么 <fileset> 仍然有用。模块 B 的文档目标可能完全不依赖于模块 A,同样还有从您的 SCM 系统中更新源代码的目标。
如果您想将编译文件的自动发现与根据编译的相互依赖性对编译进行排序结合在一起,那么您将必须编写一个定 制的 Ant 任务。基本的想法是编写一个使用 <fileset> 的任务(让我们目前称之为 <buildlist>),确定依赖关系并计算 <subant> 必须使用的顺序。然后它创建一个以正确的顺序包含编译文件的 <path>,然后将对这个路径的一个引用放到项目中。调用将类似于
<target name="build-all"> <buildlist reference="my-build-path"> <fileset dir="." includes="module-*/build.xml"/> </buildlist> <subant target="jar"> <buildpath refid="my-build-path"/> </subant> </target>
这个假想的 buildlist 任务已经在 Ant 用户邮件列表和 bug 跟踪系统中进行了讨论。很有可能 Ant 的一个将来的版本中将包含这样的一个任务。
在 Ant 1.6 中已经增加了大量的新特性。这些新功能中的许多功能使得编译模板易于创建、构造和定制。特别是 <import> 和 <target> 进行了覆盖。<import>、<macrodef> 和 <subant> 特性很有可能使得 Ant 编译可高度重用。<scriptdef>(本文中未讨论)对于需要一些脚本但不想用 Java 编写定制任务的人而言可能非常有吸引力。
(转)http://www.oracle.com/technology/global/cn/pub/articles/bodewig_ant1.6.html
发表评论
-
web.xml里<filter-mapping>中的<dispatcher>作用
2009-12-08 17:20 11220在2.4版本的servlet规范在部属描述符中新增加 ... -
(转)Taglib部署的三种方式
2009-12-04 13:07 0本周,由于项目的需要引入了jstl,但是在jsp页 ... -
Iframe页面请求跳转问题解决
2009-11-04 21:15 5234问题描述: 在父页面的一个Iframe页面中,提交请求后 ... -
JAF简介
2009-11-01 21:05 2558JAF全称是JavaBeans ... -
是 String , StringBuffer 还是 StringBuilder ?
2009-10-18 15:42 1424相信大家对 String 和 StringBuffer 的区别 ... -
选择Java接口还是抽象类
2009-10-17 16:23 3491关于java接口与 ... -
Java接口与Java抽象类的区别
2009-10-17 16:01 1413Java接口与Java抽象类的区别: 1. Java抽 ... -
为何不能通过返回值来区分重载方法?
2009-06-28 16:20 3093在java中,重载是其一个非常重要的特性。使用重载,我 ... -
怎么处理警告:编码 GBK 的不可映射字符
2009-04-17 01:31 3061在使用ant编译代码时提示 “编码 GBK 的不可映射字 ... -
既然认为它是好的,就要发挥到极限-系列之二单元测试
2009-03-29 17:07 958(原文)http://www.blogjava.net ... -
weblogic10 下对jVM性能调优设置(参考资料)
2009-03-25 12:36 2906对 JRockit JVM优化 Ta ... -
lazy initialization实现Singleton时synchronized的必要性
2009-03-19 21:48 2468首先了解一下Singleton模式通常的两种表现形式: 第一种 ... -
Guidelines, Patterns, and Code for End-to-End Java
2009-02-02 13:45 1057This document contains recomm ... -
poi即将提供对OOXML的支持
2008-11-06 23:18 9176POI是apache项目之一,最新版是3.2,它提 ... -
JSP在Servlet中的几个编码的作用及原理
2008-10-05 11:27 1610首先,说说JSP/Ser ... -
使用jconsole监控Apusic
2008-08-19 10:39 1599JDK 1.5+提供了jconsole工具,可以对JVM实例的 ... -
jconsole+tomcat配置说明(基于jdk5.0)
2008-08-18 23:18 8569最近需要参与一些java程 ... -
CruiseControl配置文档元素详解
2008-07-31 22:16 0<cruisecontrol> & ... -
抽象类和接口的区别
2008-07-26 20:19 1049在Java语言中, abstract class ... -
十个最好的Java性能故障排除工具
2008-07-21 13:00 1445推荐十个最好的Java性能故障排除工具: 1.jconsole ...
相关推荐
尽管随着时间的推移,新的工具如Maven和Gradle提供了更多的功能和便利性,但Ant的基础理念和设计模式仍然影响着现代的构建工具。对于学习构建工具的历史和理解构建过程,Ant 1.6仍然是一个值得研究的重要版本。
总结来说,Ant 1.6.jar.zip是一个包含Ant 1.6版本核心库和许可证信息的压缩文件,它为Java项目的构建提供了强大且灵活的解决方案。开发者可以通过编写XML配置文件,利用Ant的各种任务和特性,实现自动化的构建流程,...
标签中的"ant_1", "ant_1.6", "ant_1.6.0", "ant-1.6.0"和"apache-ant-1.6"都指的是Apache Ant的不同版本,1.6.0是其中的一个稳定版本,发布于2003年,提供了许多改进和新特性,比如支持JUnit 3.8,对ivy依赖管理...
在Ant 1.6版本中,提供了一个名为"ant-1.6-sources.jar.zip"的压缩包,这个文件包含了Ant 1.6版本的源代码,对于学习和理解Ant的工作原理以及扩展其功能具有极高的价值。 首先,让我们深入了解Ant的核心概念。Ant的...
而`ant-launcher-1.6.jar`是Apache Ant项目的一部分,专为启动Ant任务而设计。本文将深入探讨Ant Launcher 1.6及其在Java项目中的应用。 一、Ant Launcher简介 Ant Launcher是Ant框架的一部分,它的主要职责是启动...
ant-javamail-1.6.jar.zip包含的ant-javamail-1.6.jar是Ant的一个邮件任务库,它为Ant构建脚本提供了发送邮件的能力。例如,你可以使用`<mail>`任务来设置发件人、收件人、主题、正文等信息,并直接在Ant脚本中发送...
JUnit4引入了注解机制,极大地简化了测试代码的编写,而JUnit5进一步增强了这一特性,提供了更多的灵活性。 "ant-junit-1.6.jar.zip"是一个包含Ant JUnit任务的库文件,它允许我们在Ant构建脚本中直接执行JUnit测试...
- 在大型项目中,Ant常用于自动化构建、测试和部署。 - 开发者可以结合IDE(如Eclipse或IntelliJ IDEA)中的Ant插件进行更高效的开发。 总之,Apache Ant 1.6.0是一个强大的工具,它简化了Java项目的构建过程,...
“ant-jakarta-oro-1.6.jar”中的“1.6”表示这是该库的一个特定版本,发布于2004年,可能包含了错误修复、性能优化或新特性。JAR文件是Java应用程序或库的标准打包格式,它将类文件、资源文件和其他元数据打包在...
总的来说,Ant 1.6.1作为一个强大的构建工具,为Java开发者提供了高效、灵活的解决方案,无论是在小型项目还是大型企业级应用中,都能发挥出其价值。通过理解和掌握Ant的使用,开发者可以提升工作效率,减少手动操作...
Ant的主要目标是替代传统的Makefile,为Java项目提供更灵活、更易于理解和维护的构建解决方案。 2. **Ant的好处** - **跨平台**:由于Ant是用Java编写的,因此它可以运行在任何支持Java的平台上,实现了真正的跨...
3. **解压Ant**:将下载的Ant压缩包解压到指定位置,如`D:\ant-1.6`。 4. **设置环境变量**:配置`ANT_HOME`指向Ant的安装目录,并将`ANT_HOME\bin`添加到`PATH`中。 5. **测试Ant**:打开命令行工具,输入`ant`命令...
Ant 通过XML格式的构建文件(通常命名为`build.xml`)来定义任务和工作流程,使得开发者可以自动化处理Java项目的编译、打包、测试等过程。 **什么是Ant?** Ant 是一个基于Java的构建工具,它允许开发者编写XML...
与早期的 Ant 和 Maven 相比,Gradle 提供了更好的可扩展性和灵活性。 在 Android Studio 中,Gradle 作为默认的构建系统,使得项目管理更加高效。Gradle 1.6 版本是 Android Studio 在早期采用的一个版本,它对 ...
2. **插件系统**:Gradle拥有丰富的插件生态系统,可以为各种项目类型(如Java、Android、Groovy等)提供开箱即用的功能。在1.6版本中,这些插件已经相当成熟,例如Java插件能自动处理源码编译、测试等任务。 3. **...
Java Ant 是一个强大的自动化构建工具,它源自Apache软件基金会,主要用来管理Java项目的构建过程。Ant基于XML格式的构建文件(通常命名为build.xml),通过定义任务(tasks)来执行各种构建操作,如编译源代码、...
8. **Javadoc和Ant工具**:JDK 1.6包含了Javadoc工具,用于生成API文档,以及Ant构建工具,这是一个基于XML的项目构建和管理工具,有助于自动化构建过程。 9. **国际化和本地化**:JDK 1.6对国际字符集和本地化支持...
### Ant 使用指南 #### 一、Ant 是什么? Ant 是 Apache 软件基金会的一个开源项目,它是一种用于构建和管理 Java ...无论是对于初学者还是经验丰富的开发者而言,掌握 Ant 的使用都将极大地提高工作效率和项目质量。
EclipseME 1.6 是一个专为J2ME(Java 2 Micro Edition)应用程序开发设计的Eclipse集成开发环境(IDE)插件。这款插件极大地提升了J2ME开发者在Eclipse中的工作效率,提供了丰富的功能,使得代码编写、调试和设备...