最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

ant

运维笔记admin55浏览0评论

ant

ant

-

2023年4月17日发(作者:索尼笔记本官方网站)javaant命令⼤全1 Ant是什么? Apache Ant 是⼀个基于 Java的⽣成⼯具。⽣成⼯具在软件开发中⽤来将源代码和其他输⼊⽂件转换为可执⾏⽂件的形式(也有可能转换为可安装的产品映像形式)。随着应⽤程序的⽣成过程变得更加复杂,确保在每次⽣成期间都使⽤精确相同的⽣成步骤,同时实现尽可能多的⾃动化,以便及时产⽣⼀致的⽣成版本2 下载、安装Ant 安装Ant下载.zip⽂件,解压缩到c:ant1.3(后⾯引⽤为%ANT_HOME%)2.1 在你运⾏Ant之前需要做⼀些配置⼯作。 将bin⽬录加⼊PATH环境变量。 设定ANT_HOME环境变量,指向你安装Ant的⽬录。在⼀些OS上,Ant的脚本可以猜测ANT_HOME(Unix和Windos NT/2000)-但最好不要依赖这⼀特性。 可选地,设定JAVA_HOME环境变量(参考下⾯的⾼级⼩节),该变量应该指向你安装JDK的⽬录。注意:不要将Ant的⽂件放到JDK/JRE的lib/ext⽬录下。Ant是个应⽤程序,⽽lib/ext⽬录是为JDK扩展使⽤的(如JCE,JSSE扩展)。⽽且通过扩展装⼊的类会有安全⽅⾯的限制。2.2 运⾏Ant 运⾏Ant⾮常简单,当你正确地安装Ant后,只要输⼊ant就可以了。 没有指定任何参数时,Ant会在当前⽬录下查询⽂件。如果找到了就⽤该⽂件作为buildfile。如果你⽤ -find 选项。 Ant就会在上级⽬录中寻找buildfile,直⾄到达⽂件系统的根。要想让Ant使⽤其他的buildfile,可以⽤参数 - buildfile file,这⾥file指定了你想使⽤的buildfile。 可以指定执⾏⼀个或多个target。当省略target时,Ant使⽤标签的default属性所指定的target。命令⾏选项总结:ant [options] [target [target2 [target3] ...]]Options:-help print this message-projecthelp print project help information-version print the version information and exit-quiet be extra quiet-verbose be extra verbose-debug print debugging information-emacs produce logging information without adornments-logfile file use given file for log output-logger classname the class that is to perform logging-listener classname add an instance of class as a project listener-buildfile file use specified buildfile-find file search for buildfile towards the root of the filesystem and use the first one found-Dproperty=value set property to value 例⼦ant使⽤当前⽬录下的运⾏Ant,执⾏缺省的target。ant -buildfile 使⽤当前⽬录下的运⾏Ant,执⾏缺省的target。ant -buildfile dist使⽤当前⽬录下的运⾏Ant,执⾏⼀个叫做dist的target。ant -buildfile -Dbuild=build/classes dist使⽤当前⽬录下的运⾏Ant,执⾏⼀个叫做dist的target,并设定build属性的值为build/classes。3 编写 Ant的buildfile是⽤XML写的。每个buildfile含有⼀个project。buildfile中每个task元素可以有⼀个id属性,可以⽤这个id值引⽤指定的任务。这个值必须是唯⼀的。(详情请参考下⾯的Task⼩节)3.1 Projectsproject有下⾯的属性:Attribute Description Requiredname 项⽬名称. Nodefault 当没有指定target时使⽤的缺省target Yesbasedir ⽤于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果属性和basedir property都没有设定,就使⽤buildfile⽂件的⽗⽬录。 No项⽬的描述以⼀个顶级的元素的形式出现(参看description⼩节)。⼀个项⽬可以定义⼀个或多个target。⼀个target是⼀系列你想要执⾏的。执⾏Ant时,你可以选择执⾏那个target。当没有给定target时,使⽤project的default属性所确定的target。3.2 Targets⼀个target可以依赖于其他的target。例如,你可能会有⼀个target⽤于编译程序,⼀个target⽤于⽣成可执⾏⽂件。你在⽣成可执⾏⽂件之前必须先编译通过,所以⽣成可执⾏⽂件的target依赖于编译target。Ant会处理这种依赖关系。然⽽,应当注意到,Ant的depends属性只指定了target应该被执⾏的顺序-如果被依赖的target⽆法运⾏,这种depends对于指定了依赖关系的target就没有影响。Ant会依照depends属性中target出现的顺序(从左到右)依次执⾏每个target。然⽽,要记住的是只要某个target依赖于⼀个target,后者就会被先执⾏。假定我们要执⾏target D。从它的依赖属性来看,你可能认为先执⾏C,然后B,最后A被执⾏。错了,C依赖于B,B依赖于A,所以先执⾏A,然后B,然后C,最后D被执⾏。⼀个target只能被执⾏⼀次,即时有多个target依赖于它(看上⾯的例⼦)。如 果(或如果不)某些属性被设定,才执⾏某个target。这样,允许根据系统的状态(java version, OS, 命令⾏属性定义等等)来更好地 控制build的过程。要想让⼀个target这样做,你就应该在target元素中,加⼊if(或unless)属性,带上target因该有所判断的 属性。例如:如果没有if或unless属性,target总会被执⾏。可选的description属性可⽤来提供关于target的⼀⾏描述,这些描述可由-projecthelp命令⾏选项输出。将你的tstamp task在⼀个所谓的初始化target是很好的做法,其他的target依赖这个初始化target。要确保初始化target是出现在其他target依赖表中的第⼀个target。在本⼿册中⼤多数的初始化target的名字是"init"。target有下⾯的属性:Attribute Description Requiredname target的名字 Yesdepends ⽤逗号分隔的target的名字列表,也就是依赖表。 Noif 执⾏target所需要设定的属性名。 Nounless 执⾏target需要清除设定的属性名。 Nodescription 关于target功能的简短描述。 No3.3 Tasks⼀个task是⼀段可执⾏的代码。⼀个task可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对property的引⽤。这些引⽤会在task执⾏前被解析。下⾯是Task的⼀般构造形式:这⾥name是task的名字,attributeN是属性名,valueN是属性值。有⼀套内置的(built-in)task,以及⼀些可选task,但你也可以编写⾃⼰的task。所有的task都有⼀个task名字属性。Ant⽤属性值来产⽣⽇志信息。可以给task赋⼀个id属性:这⾥taskname是task的名字,⽽taskID是这个task的唯⼀标识符。通过这个标识符,你可以在脚本中引⽤相应的task。例如,在脚本中你可以这样:设定某个task实例的foo属性。在另⼀个task中(⽤java编写),你可以利⽤下⾯的语句存取相应的实例。erence("task1").注意1:如果task1还没有运⾏,就不会被⽣效(例如:不设定属性),如果你在随后配置它,你所作的⼀切都会被覆盖。注意2:未来的Ant版本可能不会兼容这⾥所提的属性,因为很有可能根本没有task实例,只有proxies。3.4 Properties⼀ 个project可以有很多的properties。可以在buildfile中⽤property task来设定,或在Ant之外设定。⼀个 property有⼀个名字和⼀个值。property可⽤于task的属性值。这是通过将属性名放在"${"和"}"之间并放在属性值的位置来实现的。 例如如果有⼀个property builddir的值是"build",这个property就可⽤于属性值:${builddir} /classes。这个值就可被解析为build/classes。内置属性如果你使⽤了 task 定义了所有的系统属性,Ant允许你使⽤这些属性。例如,${}对应操作系统的名字。要想得到系统属性的列表可参考the Javadoc of perties。除了Java的系统属性,Ant还定义了⼀些⾃⼰的内置属性: basedir project基⽬录的绝对路径 (与的basedir属性⼀样)。 buildfile的绝对路径。n Ant的版本。 当前执⾏的project的名字;由的name属性设定.n Ant检测到的JVM的版本; ⽬前的值有"1.1", "1.2", "1.3" and "1.4".例⼦ 3.5 Path-like Structures你可以⽤":"和";"作为分隔符,指定类似PATH和CLASSPATH的引⽤。Ant会把分隔符转换为当前系统所⽤的分隔符。当需要指定类似路径的值时,可以使⽤嵌套元素。⼀般的形式是location属性指定了相对于project基⽬录的⼀个⽂件和⽬录,⽽path属性接受逗号或分号分隔的⼀个位置列表。path属性⼀般⽤作预定义的路径--其他情况下,应该⽤多个location属性。为简洁起见,classpath标签⽀持⾃⼰的path和location属性。所以:可以被简写作:也可通过元素指定路径。构成⼀个fileset的多个⽂件加⼊path-like structure的顺序是未定的。上⾯的例⼦构造了⼀个路径值包括:${classpath}的路径,跟着lib⽬录下的所有jar⽂件,接着是classes⽬录。如果你想在多个task中使⽤相同的path-like structure,你可以⽤元素定义他们(与target同级),然后通过id属性引⽤--参考Referencs例⼦。path-like structure可能包括对另⼀个path-like structurede的引⽤(通过嵌套元素):前⾯所提的关于的简洁写法对于也是有效的,如:可写成:命令⾏变量有些task可接受参数,并将其传递给另⼀个进程。为了能在变量中包含空格字符,可使⽤嵌套的arg元素。Attribute Description Requiredvalue ⼀个命令⾏变量;可包含空格字符。 只能⽤⼀个line 空格分隔的命令⾏变量列表。 file 作为命令⾏变量的⽂件名;会被⽂件的绝对名替代。 path ⼀个作为单个命令⾏变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。 例⼦是⼀个含有空格的单个的命令⾏变量。是两个空格分隔的命令⾏变量。是⼀个命令⾏变量,其值在DOS系统上为dir;dir2;dir3;在Unix系统上为/dir:/dir2:/dir3 。Referencesbuildfile元素的id属性可⽤来引⽤这些元素。如果你需要⼀遍遍的复制相同的XML代码块,这⼀属性就很有⽤--如多次使⽤结构。下⾯的例⼦: 可以写成如下形式: 所有使⽤PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引⽤。 4.1 File(Directory)类4.1.1 Mkdir 创建⼀个⽬录,如果他的⽗⽬录不存在,也会被同时创建。 例⼦: 说明: 如果build不存在,也会被同时创建4.1.2 Copy 拷贝⼀个(组)⽂件、⽬录 例⼦:1. 拷贝单个的⽂件: 2. 拷贝单个的⽂件到指定⽬录下3. 拷贝⼀个⽬录到另外⼀个⽬录下4. 拷贝⼀批⽂件到指定⽬录下5. 拷贝⼀批⽂件到指定⽬录下,将⽂件名后增加。Bak后缀6. 拷贝⼀组⽂件到指定⽬录下,替换其中的@标签@内容4.1.3 Delete 删除⼀个(组)⽂件或者⽬录 例⼦1. 删除⼀个⽂件2. 删除指定⽬录及其⼦⽬录3. 删除指定的⼀组⽂件4. 删除指定⽬录及其⼦⽬录,包括他⾃⼰4.1.4 Move 移动或重命名⼀个(组)⽂件、⽬录 例⼦:1. 移动或重命名⼀个⽂件2. 移动或重命名⼀个⽂件到另⼀个⽂件夹下⾯3. 将⼀个⽬录移到另外⼀个⽬录下4. 将⼀组⽂件移动到另外的⽬录下5. 移动⽂件过程中增加。Bak后缀 4.2 Java相关4.2.1 Javac 编译java原代码 例⼦1. 编译${src}⽬录及其⼦⽬录下的所有。Java⽂件,。Class⽂件将放在${build}指定的⽬录下,classpath表⽰需要⽤到的类⽂件或者⽬录,debug设置为on表⽰输出debug信息2. 编 译${src}和${src2}⽬录及其⼦⽬录下的所有。Java⽂件,但是package/p1/**,mypackage/p2/**将被编译,⽽ mypackage/p1/testpackage/**将不会被编译。Class⽂件将放在${build}指定的⽬录下,classpath表⽰需要 ⽤到的类⽂件或者⽬录,debug设置为on表⽰输出debug信息3. 路径是在property中定义的4.2.2 java 执⾏指定的java类 例⼦:1. classname中指定要执⾏的类,classpath设定要使⽤的环境变量2. 4.3 打包相关4.3.1 jar 将⼀组⽂件打包 例⼦:1. 将${build}/classes下⾯的所有⽂件打包到${dist}/lib/中2. 将${build}/classes下⾯的所有⽂件打包到${dist}/lib/中,但是包括mypackage/test/所有⽂件不包括所有的3. manifest属性指定⾃⼰的META-INF/⽂件,⽽不是由系统⽣成4.3.2 war 对Jar的扩展,⽤于打包Web应⽤ 例⼦: 假设我们的⽂件⽬录如下:thirdparty/libs/thirdparty/libs/build/main/com/myco/myapp/src/metadata/src/html/myapp/src/jsp/myapp/src/graphics/images/gifs/small/src/graphics/images/gifs/large/ 下⾯是我们的任务的内容: 完成后的结果:WEB-INF/WEB-INF/lib/WEB-INF/classes/com/myco/myapp/META-INF/images/small/images/large/4.3.3 ear ⽤于打包企业应⽤ 例⼦ 4.4 时间戳在⽣成环境中使⽤当前时间和⽇期,以某种⽅式标记某个⽣成任务的输出,以便记录它是何时⽣成的,这经常是可取的。这可能涉及编辑⼀个⽂件,以便插⼊⼀个字符串来指定⽇期和时间,或将这个信息合并到 JAR 或 zip ⽂件的⽂件名中。这种需要是通过简单但是⾮常有⽤的 tstamp 任务来解决的。这个任务通常在某次⽣成过程开始时调⽤,⽐如在⼀个 init ⽬标中。这个任务不需要属性,许多情况下只需 就⾜够了。tstamp 不产⽣任何输出;相反,它根据当前系统时间和⽇期设置 Ant 属性。下⾯是 tstamp 设置的⼀些属性、对每个属性的说明,以及这些属性可被设置到的值的例⼦:属性 说明 例⼦ DSTAMP 设置为当前⽇期,默认格式为yyyymmdd 20031217TSTAMP 设置为当前时间,默认格式为 hhmm 1603TODAY 设置为当前⽇期,带完整的⽉份 2003 年 12 ⽉ 17 ⽇例如,在前⼀⼩节中,我们按如下⽅式创建了⼀个 JAR ⽂件:在调⽤ tstamp 任务之后,我们能够根据⽇期命名该 JAR ⽂件,如下所⽰:因此,如果这个任务在 2003 年 12 ⽉ 17 ⽇调⽤,该 JAR ⽂件将被命名为 。还可以配置 tstamp 任务来设置不同的属性,应⽤⼀个当前时间之前或之后的时间偏移,或以不同的⽅式格式化该字符串。所有这些都是使⽤⼀个嵌套的 format 元素来完成的,如下所⽰:上⾯的清单将 OFFSET_TIME 属性设置为距离当前时间 10 分钟之后的⼩时数、分钟数和秒数。⽤于定义格式字符串的字符与 DateFormat 类所定义的那些格式字符相同 4.5 执⾏SQL语句 通过jdbc执⾏SQL语句 例⼦:1. 2. 只有在oracle、版本是8.1的时候才执⾏ 4.6 发送邮件 使⽤SMTP服务器发送邮件 例⼦:The ${buildname} nightly build has completed mailhost: SMTP服务器地址 mailport: 服务器端⼝ subject: 主题 from: 发送⼈地址 to: 接受⼈地址 message: 发送的消息 fileset: 设置附件==================================================================== 在ANT 出现之前,编译和部署Java应⽤需要使⽤包括特定平台的脚本、Make⽂件、不同的IDE以及⼿⼯操作等组成的⼤杂烩。现在,⼏乎所有的开源Java项 ⽬都在使⽤Ant,许多公司的开发项⽬也在使⽤Ant。Ant的⼤量使⽤,也⾃然带来了对总结Ant最佳实践的迫切需求。 本⽂总结了我 喜好的Ant最佳实践,很多是从亲⾝经历的项⽬错误,或从其他开发者的“恐怖”故事中得到的灵感的。⽐如,有⼈告诉我有个项⽬将 XDoclet ⽣成的 代码放⼊锁定⽂件的版本控制⼯具中。单开发者修改源代码时,他必须记住⼿⼯检出(Check out)并锁定所有将要重⽣成的⽂件。然后,⼿⼯运⾏代码⽣ 成器,当他能够让Ant编译代码时,这⼀⽅法还存在⼀些问题: ⽣成的代码⽆法存储在版本控制系统中 Ant(本案例中是Xdoclet)应该⾃动确定下⼀次构建涉及的源⽂件,⽽不应由程序员⼈⼯确定。 Ant的构建⽂件应该定义好正确的任务依赖关系,这样程序员不必按照特定顺序调⽤任务。 当我开始⼀个新项⽬时,我⾸先编写Ant构建⽂件。⽂件定义构建的过程,并为团队中的每个程序员都使⽤。本⽂所有的最佳实践假设Ant构建⽂件是⼀个必须精⼼编写的重要⽂件,它应在版本控制系统中得到维护,并定期进⾏重构。下⾯是我的⼗五⼤Ant最佳实践。 1. 采⽤⼀致的编码规范 Ant⽤户不管是喜欢还是痛恨XML构建⽂件的语法,都愿意跳进这⼀迷⼈的争论中。让我们先看⼀些保持XML构建⽂件简洁的⽅法。 ⾸ 先,也是最重要的,化费时间格式化你的XML让它看上去很清晰。不过XML是否美观,Ant都可以⼯作。但是丑陋的XML很难读懂。倘若你在任务之间留出 空⾏,有规则的缩进,每⾏⽂字不超过90列,那么XML令⼈惊讶的易读。再加上好的编辑器或IDE⾼亮相应的语句,你就不会有如何阅读的⿇烦。同样,精选 有意义明确、容易读懂的词汇来命名任务和属性。⽐如,s就⽐rpts好。并不需要特定的编码规范,只要有⼀种规范并坚持使⽤就好。 2. 将 放在项⽬根⽬录中 Ant构建⽂件可以放在如何位置,但是放在项⽬顶层⽬录中可以保持项⽬简洁。这是最普遍的规范,使开发者能够在根⽬录找到它。同时,也能够容易了解项⽬中不同⽬录之间的逻辑关系。以下是⼀个典型的项⽬层次: [root dir] | +--src +--lib (包含第三⽅ JAR包) +--build (由 build任务⽣成) +--dist (由 build任务⽣成)当在顶级⽬录时,倘若你在项⽬某个⼦⽬录中,只要输⼊:ant -find compile 命令,不需要改变⼯作⽬录就能够以命令⾏⽅式编译代码。参数-find告诉Ant寻找存在于上级⽬录中的并执⾏。 3. 使⽤单⼀构建⽂件 有⼈喜欢将⼀个⼤项⽬分解到⼏个⼩的构建⽂件,每个构建⽂件分担整个构建过程的⼀⼩部分⼯作。但是应该认识到,将构建⽂件分割会增加对整个构建过程的理解难度。要注意在单⼀构建⽂件能够清楚表现构建层次的情况下,不要过⼯程化(over-engineer)。 即使你把项⽬划分为多个构建⽂件,也应使程序员能够在项⽬根⽬录下找到核⼼。尽管该⽂件只是将实际构建⼯作委派给下级构建⽂件,也应保证该⽂件可⽤。 4. 提供良好的帮助说明 应尽量使构建⽂件⾃⽂档化。增加任务描述是最简单的⽅法。当你输⼊ant -projecthelp时,你就可以看到带有描述的任务清单。⽐如,你可以这样定义任务: 最简单的规则是对所有你希望程序员通过命令⾏直接调⽤的任务都加上描述。对于⼀般⽤来执⾏中间处理过程的内部任务,⽐如⽣成代码或建⽴输出⽬录等,就⽆法使⽤描述属性。 这时,可以通过在构建⽂件中加⼊XML注释来处理。或者专门定义⼀个help任务,当程序员输⼊ant help时来显⽰详细的使⽤说明。 Detailed help...5. 提供清空任务 每个构建⽂件都应包含⼀个清空任务,删除所有⽣成的⽂件和⽬录,使系统回到构建⽂件执⾏前的初始状态。执⾏清空任务后还存在的⽂件应处在版本控制系统的管理下。 ⽐如: 除⾮是在产⽣整个系统版本的特殊任务中,否则不要⾃动调⽤clean任务。当程序员仅仅执⾏编译任务或其他任务时,他们不需要构建⽂件事先执⾏即令⼈讨厌有没有必要的清空任务。要相信程序员能够确定何时需要清空所有⽂件。 6. 使⽤ANT管理任务从属关系 假 设你的应⽤由Swing GUI组件、Web界⾯、EJB层和公共应⽤代码组成。在⼤型系统中,你需要清晰地定义Java包属于系统的哪⼀层。否则如何⼀ 点修改都要重新编译成千上百个⽂件。任务从属关系管理差会导致过度复杂⽽脆弱的系统。改变GUI⾯板的设计不应造成Servlet和EJB的重编译。 当系统变得庞⼤后,稍不注意就可能将依赖于客户端的代码引⼊到服务端。这是因为IDE在编译⽂件时使⽤单⼀的classpath。Ant让你更有效地控制构建活动。 设计你的构建⽂件编译⼤型项⽬的步骤:⾸先,编译公共应⽤代码,将编译结果打成JAR包⽂件。然后,编译上⼀层的项⽬代码,编译时依靠第⼀步产⽣的JAR⽂件。不断重复这⼀过程,直到最⾼层的代码编译完成。 分步构建强化了任务从属关系管理。如果你⼯作在底层Java框架上,引⽤⾼层的GUI模板组件,这时代码不需要编译。这是由于构建⽂件在编译底层框架时,在源路径中没有包含⾼层GUI⾯板组件的代码。 7. 定义并重⽤⽂件路径 如果⽂件路径在⼀个地⽅集中定义,并在整个构建⽂件中得到重⽤,那么构建⽂件更易于理解。以下是这样做的⼀个例⼦: ...etc 当 项⽬不断增长,构建⽇益复杂时,这⼀技术越发体现出其价值。你可能为编译不同层次的应⽤定义各⾃的⽂件路径,⽐如运⾏单元测试的、运⾏应⽤程序的、运⾏ Xdoclet的、⽣成JavaDocs的等等不同路径。这种组件化路径定义的⽅法⽐为每个任务单独定义路径要优越得多。否则,很容易丢失任务任务从属关 系的轨迹。 8. 定义恰当的任务参数关系 假设dist任务从属于jar任务,那么哪个任务从属于compile任 务,哪个任务从属于prepare任务呢?Ant构建⽂件最终定义了任务的从属关系图,它必须被仔细地定义和维护。应该定期检查任务的从属关系以保证构建 ⼯作得到正确执⾏。⼤的构建⽂件随着时间推移趋向于增加更多的任务,所以到最后由于不必要的从属关系导致构建⼯作⾮常困难。⽐如,你可能发现在程序员只是 需要编译⼀些没有使⽤EJB的GUI代码时,重新⽣成EJB代码。 以“优化”的名义忽略任务的从属关系是另⼀种常见的错误。这种错误迫 使程序员为了得到恰当的结果必须记住并按照特定的顺序调⽤⼀串任务。更好的做法是:提供描述清晰的公共任务,这些任务包含正确的任务从属关系;另外提供⼀ 套“专家”任务让你能够⼿⼯执⾏个别的构建步骤,这些任务不提供完整的构建过程,但是让那些专家在快速⽽恼⼈的编码期间跳过某些步骤 9.使⽤配置属性 任何需要配置或可能发⽣变化的信息都应作为Ant属性定义下来。对于在构建⽂件中多次出现的值也同样处理。属性既可以在构建⽂件头部定义,也可以为了更好的灵活性⽽在单独的属性⽂件中定义。以下是在构建⽂件中定义属性的样式: etc...或者你可以使⽤属性⽂件: etc...在属性⽂件 ties中: ===../java-tools/=th=${}/build/${}⽤⼀个独⽴的⽂件定义属性是有好处的,它可以清晰地定义构建中的可配置部分。另外,在开发者⼯作在不同操作系统的情况下,你可以在不同的平台上提供该⽂件的不同版本。 10. 保持构建过程独⽴ 为 了最⼤限度的扩展性,不要应⽤外部路径和库⽂件。最重要的是不要依赖于程序员的CLASSPATH设置。取⽽代之的是,在构建⽂件中使⽤相对路径并定义⾃ ⼰的路径。如果你引⽤了绝对路径如C:javatools,其他开发者未必使⽤与你相同的⽬录结构,所以就⽆法使⽤你的构建⽂件 如果你部署开发源码项⽬,应该提供包括所有需要的JAR⽂件的发⾏版本,当然是在遵守许可协议的基础上。对于内部项⽬,相关的JAR⽂件都应在版本控制系统的管理中,并捡出到⼤家都知道的位置。 当你不得不应⽤外部路径时,应将路径定义为属性。使程序员能够涌适合他们⾃⼰的机器的参数重载这些属性。你也可以使⽤以下语法引⽤环境变量: 11. 使⽤版本控制系统 构建⽂件是⼀个重要的⽂件,应该象代码⼀样进⾏版本控制。当你标记你的代码时,也应⽤同样的标签标记构建⽂件。这样当你需要回溯构建旧版本的软件时,能够使⽤相对应的旧版本构建⽂件。 除构建⽂件之外,你还应在版本控制中维护第三⽅JAR⽂件。同样,这使你能够重新构建旧版本的软件。这也能够更容易保证所有开发者拥有⼀致的JAR⽂件,因为他们都是同构建⽂件⼀起从版本控制系统中捡出的。 通常应避免在版本控制系统中存放构建输出品。倘若你的源代码很好地得到了版本控制,那么通过构建过程你能够重新⽣成任何版本的产品。 12. 把Ant作为“最⼩公分母” 假设你的开发团队使⽤IDE,为什么要为程序员通过点击图标就能够构建整个应⽤⽽烦恼呢? IDE 的问题在团队中是⼀个关于⼀致性和重现性的问题。⼏乎所有的IDE设计初衷都是为了提⾼程序员的个⼈⽣产率,⽽不是开发团队的持续构建。典型的IDE要求 每个程序员定义⾃⼰的项⽬⽂件。程序员可能拥有不同的⽬录结构,可能使⽤不同版本的库⽂件,还可能⼯作在不同的平台上。这将导致出现这种情况:在A那⾥运 ⾏良好的代码,到B那⾥就⽆法运⾏。 不管你的开发团队使⽤何种IDE,⼀定要建⽴所有程序员都能够使⽤的Ant构建⽂件。要建⽴⼀个程 序员在将新代码提交版本控制系统前必须执⾏Ant 构建⽂件的规则。这将确保代码是经过同⼀个Ant构建⽂件构建的。当出现问题时,要使⽤项⽬标准的 Ant构建⽂件,⽽不是通过某个IDE来执⾏⼀个⼲净的构建。 程序员可以⾃由选择任何他们习惯使⽤的IDE。但是Ant应作为公共基线以保证永远是可构建的。 13. 使⽤ zipfileset属性 ⼈们经常使⽤Ant产⽣WAR、JAR、ZIP和 EAR⽂件。这些⽂件通常都要求有⼀个特定的内部⽬录结构,但其往往与你的源代码和编译环境的⽬录结构不匹配。 ⼀个最常⽤的⽅法是写⼀个Ant任务按照期望的⽬录结构把⼀⼤堆⽂件拷贝到临时⽬录中,然后⽣成压缩⽂件。这不是最有效的⽅法。使⽤zipfileset属性是更好的解决⽅案。它让你从任何位置选择⽂件,然后把它们按照不同⽬录结构放进压缩⽂件中。以下是⼀个例⼦: 在这个例⼦中,所有JAR⽂件都放在EAR⽂件包的lib⽬录中。和是从构建⽬录拷贝过来的。因此我们使⽤zipfileset属性把它们移动到EAR⽂件包内部的lib⽬录。prefix属性指定了其在EAR⽂件中的⽬标路径。 14. 运⾏ Clean 构建任务的测试 假设你的构建⽂件中有clean和compile的任务,执⾏以下的测试。第⼀步,执⾏ant clean;第⼆步,执⾏ant compile;第三步,再执⾏ant compile。第三步应该不作任何事情。如果⽂件再次被编译,说明你的构建⽂件有问题。 构建⽂件应该只在与输出⽂件相关联的输⼊⽂件发⽣变化时,才应该执⾏任务。⼀个构建⽂件在不必执⾏诸如编译、拷贝或其他⼯作任务的时候执⾏这些等任务是低效的。当项⽬规模增长时,即使是⼩的低效⼯作也会成为⼤的问题。 15. 避免特定平台的Ant包 不管什么原因,有⼈喜欢⽤简单的、名称叫做compile之类的批⽂件或脚本装载他们的产品。当你去看脚本的内容,你会发现以下内容: ant compile其实开发⼈员熟悉Ant,并且完全能够⾃⼰键⼊ant compile。请不要仅仅为了调⽤Ant⽽使⽤特定平台的脚本。这只会使其他⼈在⾸次使⽤你的脚本时,增加学习和理解的烦扰。除此之外,你不可能提供适⽤于每个操作系统的脚本,这是真正烦扰其他⽤户的地⽅。 总结 太多的公司依靠⼿⼯⽅法和程序来编译代码和⽣成软件发布版本。那些不使⽤Ant或类似⼯具定义构建过程的开发团队,花费了令⼈惊异的时间来捕捉代码编译过程中出现的问题,这些在某些开发者那⾥编译成功的代码,到另⼀些开发者那⾥却失败了。 ⽣成并维护构建脚本不是⼀项迷⼈的⼯作,但却是⼀项必需的⼯作。⼀个好的Ant构建⽂件将使你集中到更喜欢的⼯作——写代码中! 参考

-

ant

发布评论

评论列表(0)

  1. 暂无评论