




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ANT学习笔记ANT简介 ANT全称为Another Neat Tool(另一种构建或打包工具),是一种使用非常广泛的Java项目构建工具,具有跨平台、易于扩展、简单和快速的特点。它伸缩性好,小到个人项目大到多团队J2EE项目,它在各种规模的项目中都可一显身手。它的用途一句话概括:除了编写具体代码之外的所有任务都可以使用ANT来帮助我们自动的实现。ANT提供了大量的内置任务可以进行编译、装配、 测试和JAVA应用以及其他语言的构建例如C和C+。ANT入门 到Apache下载ANT并配置环境变量:ANT_HOME,PATH。下面来使用ANT来新建或删除文件夹(可以删除包含文件的文件夹)。1. 建立ANT默认读取的xml:build.xml。 2. 在cmd下使用“ant”命令则会工具build.xml的定义建立或删除目录,ANT默认读取duild.xml如果使用自定义xml名称则可以在使用“ant”命令的时候加上参数实行要读取的文件名:ant -f hello.xml。 在Ant中对于路径分隔符使用或/都可以。ANT命令使用介绍 执行指定 :ant targetName;执行多个 : ant target1Name target2Name ;执行ant并指定xml文件名 :ant -f fileName.xml targetName,targetName;ant h/ant help 将打印出ant可用参数列表ant p/ant projecthelp 将打印关于buildfile的信息,包含了住目标和其下级目标。ant version 将打印当前使用的ant的版本信息。ant diagnostics 输出ant项目的运行环境、依赖库、版本以及系统信息等,为错误诊断和报告提供一些有用的帮助信息。就像以前360对电脑的扫描生成一个诊断书类似。ant debug/ant d 显示ant执行调试的信息、详细的log信息。 ant lib 指定ant运行时依赖的一个或多个类库所在的位置(jar文件路径),让ant可以使用这些文件,加上-d以查看是否加上了path指定的类库,例如:ant lib D:/Java/test.jar,指定ant工具构建的时候多加一个test.jar文件。 ant logfile fileName 使ant的输出到一个指定的文件中而不是输出到ant运行的终端的准输出设备上。这在Unix系统的每日创建的时候是很有用的。-logfile选项还可以和-listener选项,-logger选项一起使用。-listener和-logger选项为监视和报告创建的结果提供了更多的功能。 ant quiet/-q 隐藏ant执行的提示输出信息,命令将不会输出具体的target执行的信息,只输出BUILD SUCCESSFUL。ant verbose/-v 显示ant执行的详细信息,包括操作系统和Java环境等信息。ant buildfile fileName 指定构建文件,默认为build.xml。ant D= 用于设定一些变量,这些变量可以在target中直接引用或覆盖已经设定的属性值。例如,ant -Ddist=build/dist2,注意-D和dist之间不能有空格,否则会默认将build/dist2当作target对待了。ant find -s 查找构建文件并执行找到的构建文件。ANT属性使用介绍(系统属性)Ant中使用$来获取属性的值,例如:$,以下系统属性直接引用即可。 操作系统名称。basedir 项目引用的跟路径。ant.home Ant工具的跟目录。ant.file 构建文件的绝对路径。ant.version ant的版本信息。ant.java.version ant检测到的JVM版本。 当前执行的项目的名称及信息。java.version Java的版本信息。java.home Java的根目录位置(jdk/jre)。java.class.path Java类库文件的位置。line.separator 换行符(有可能是不可见字符)。user.home 用户的home目录,在Linux和Unix中经常用到。ANT xml注释的三种方式使用xml的方式注释、在中加入标签,在其中写注释、在中的description中写注释。使用xml的注释方式更清晰、使用description便签或description属性的方式更能提供结构化的注释。项目构建并准文件夹命名 src 源文件;build/classes class文件(中转站,可被删除) ;dist 产出文件ANT生成文件剖析ANT没有定义它自己的自定义语法,它的生成文件使用xml编写的。存在一组ANT能够理解的预定义xml元素,而且还可以定义新的元素来扩展ANT的功能。每个生成文件由单个元素组成,该元素又包含一个或多个元素。一个目标(target)是生成过程中自己定义的一个步骤,它执行任意数量的操作,比如编译一组源文件。并且这些操作本身是由其它专用任务标签执行的。然后这些任务将根据需要被分组到各个target元素中。一次生成过程所必须的所有操作可以放入单个target元素中,但是那样会降低灵活性。将那些操作划分成逻辑生成步骤,每个步骤包含在它自己的target元素中,这样通常更为可取。这样可以执行整体生成过程中的单独部分,却不一定要执行其他部分。例如,通过仅掉用某些目标,您可以编译项目的源代码,却不必创建可安装的项目文件。生成一个项目一般需要许多步骤首先需要编译源代码,然后将它打包成Java归档文件(Java Archive File JAR)。这其中许多步骤都具有清楚定义的顺序例如,在编译器从源代码生产类文件之前是不能打包类文件。与顺序指定target所不同的是,ANT采用一种更灵活的方式来定义依赖关系。每个目标的定义依据的是它能够执行之前必须完成的其他所有目标。这是使用target元素的depends属性来实现的,例如: 连续执行多个 : 指定, 在 这样当使用“ant”执行的时候就会先读取default,发现default指定的依赖于那么将会先执行frist再执行second。因为在build.xml文件中没有使用命名空间,所以标签的顺序是没有先后的,每个target之间使用depends关联。target在生成文件中出现的顺序与执行顺序无关,执行顺完全依赖以depends和ant命令中显示指定的target顺序。这种方式允许我们执行项目任何阶段的生成过程,ant会首先执行已定义的先决阶段。举例说明上面的叙述,例如如下代码对应执行结果:注意:如果关联的depends已经执行完毕就不再重复执行,但是如果显示的使用ant命令指定target执行顺序即使被关联对象已经执行完毕但是当执行目标对象的时候它所关联的target还是会被执行但是可能没有实际执行,没有输出,到底有没有真正的执行有待考证。ANT属性ANT中的属性类似于编程语言中的变量,它们都具有名称和值。然而与通常的变量不同,ANT中的属性一经设置它们的值就不再改变,就想Java中的String对象。如果给某个属性赋予一个新值,这不回被看作一个错误并且该属性还是会保留原来的值。这看起来似乎很有局限性,但这样是为了遵循ANT的简单原则,毕竟它是一种生成工具而不是一种编程语言。定义与使用属性的方式:使用定义属性,为了在生成文件的其他部分使用这个属性,使用类似EL表达式的语法:$metal,例如: 为了使用这样一个值,它是另一个属性的值的组成部分,将标签写成下面这样: 例如: 在“ant”命令中还可以加上“-D propertyName”参数,表示为构建文件的property传递参数,但是参数一旦传递就不能在改变(原有的value会失效?)。Location属性属性经常用户引用文件系统中的目录或文件,但是使用不同的路径分隔符(例如, 与 /)的平台来说,这可能在跨不同的平台的时候导致问题。ANT的location属性专门设计用于以平台无关的方式包含系统文件路径,像下面使用location来代替value: 使用location属性我们就可以轻松的指定一个路径的地址,对于不同的路径分隔符ANT会自动根据系统平台进行转换。对于location属性的路径分隔符字符被转换为当前平台的正确格式,而且由于文件名是相对的,它被认为是相对于项目的基目录。我们同样可以很轻松地写成下面这样: 这两个版本在不同平台上会表现出相同的行为。 在构建文件中如果属性太多的时候可以将属性定义到一个外部的property文件中,在构建文件中使用来引入外部文件,但是如果属性是路径类型的就不建议写到属性文件中,因为这样就无法设置location的值了。Eclipse/MyEclipse对ANT的支持ANT的使用需要编写生成文件,构建文件我们期望有代码提示,在Ecplise/MyEclipse中就提供了这样的功能。新建一个build.xml的文件(基本上所有的项目构建文件都叫做build.xml)使用ANT编辑器打开就会有代码提示功能。方法是:WindowPreferencesGeneralEditorsFile Associations,选择add输入build.xml(默认用ANT编辑器编辑的文件),在下面选择ANT编辑器并设为默认。在windowshow View中还可以打开ANT视图,将构建文件拖入构建视图可以看到构建文件的结构和更轻松的选择要运行的target(双击即可),不同于Outline视图,Outline是进入源文件的。ANT的构建文件在IDE中还支持断点调试。ANT编译类文件使用ANT编译类文件的格式:,这个标签寻找src目录下的以.java结尾的所有文件,并对它们调用javac进行编译。默认将Class文件放到和源代码相同的目录,也可以使用destdir指定生产的Class文件的存放目录,默认将连同包一起放到destdir中。例如: 其他有用选项 :-classpath 等价于javac中的-classpath选项;-debug=“true”指示编译器应带调试信息编译源文件。a任务的一个重要特点在于,它仅编译那些它认为需要编译的源文件。如果某个类文件已经存在并且对应的源文件自从该类文件生成以来还没有被改变过,那么该源文件就不回被重新编译。Javac任务的输出显示了实际被编译的源文件的数目。这种行为刻画了Ant的愈多任务的特点:如果某个任务能够确定所请求的操作不需要被执行,那么该操作就会被跳过。ANT创建jar文件在编译Java源文件之后,结果类文件通常被打包到一个jar文件中,这个文件类似于zip归档文件。每个jar文件都包含一个清单文件(),它可以指定该jar文件的属性。下面是Ant中jar任务的一个简单示例:destfile :生成的jar文件名;basedir :Class文件所在目录。 这将创建一个名为package.jar的jar文件,并把classes目录中的所有文件添加到其中(jar文件能够包含任意类型的文件而不只是类文件,一些框架通常是将配置文件打包到jar文件中)。此处没有指定清单文件那么Ant将提供一个基本的清单文件。例如: Manifest属性允许指定一个用作该jar文件的清单文件。清单文件的内容还可以使用manifest任务在生成文件中指定,这个任务能够向文件系统写入一个清单文件,或者能够实际嵌套在jar之内,以便一次性地创建清单文件和jar文件。在对于图形界面或命令行程序打包成jar后可以双击运行,但是需要在清单文件中通过Main-Class指定双击运行时的main所在类的名字。这可以通过Ant的自动构建完成。例如: 注意:Ant构建的时候对于已经存在的目录将不再创建,已经编译的类文件将不再重新编译,如果文件发生变化,哪怕是加了一个空格,那么Ant会发现这种变化并重新编译或生成,即重新构建项目。这种行为是否可以更改?例如javac任务第二次执行的时候会检查代码的依赖,会执行下面的步骤:1.检查代码产生的代码树(代码之间的依赖关系);2.与源代码树进行匹配。 1)判断class是否和java代码是否对应; 2)判断是否需要重新编译;需要匹配源代码树和目标树,就是靠这种方式来检查是否需要重新编译的,如果源代码树发生了改变就会重新编译。当ant中一个target有多个依赖的时候,ant会按照依赖目标的顺序执行。请分析以下任务以及执行结果任务代码1 init invoked! compile invoked! archive invoked! 在cmd下执行:D:ANTant f build2.xml compile archive执行结果Buildfile: D:ANTbuild2.xmlinit: echo init invoked! mkdir Created dir: D:ANTinitcompile: echo compile invoked! mkdir Created dir: D:ANTcompileinit: echo init invoked!compile: echo compile invoked!archive: echo archive invoked!BUILD SUCCESSFULTotal time: 0 seconds以上执行任务说明:执行过的任务就不会再次执行了。例外注意上面任务的执行顺序是一个重点。继续分析任务执行顺序任务代码2执行结果:Buildfile: D:JAVAMyEclipseWorkAntbuild-execute-order3.xmlinit: mkdir Created dir: D:JAVAMyEclipseWorkAntbuildclasses mkdir Created dir: D:JAVAMyEclipseWorkAntbuilddistcompile: javac Compiling 1 source file to D:JAVAMyEclipseWorkAntbuildclassesdeploy: jar Building jar: D:JAVAMyEclipseWorkAntpackage.jarclean: delete Deleting directory D:JAVAMyEclipseWorkAntbuildclasses delete Deleting directory D:JAVAMyEclipseWorkAntbuilddistall:BUILD SUCCESSFULTotal time: 1 second解释:deploy和clean都会依赖init,但是deploy依赖的init执行之后clean依赖的init就不会再执行了,因为任务已经执行并且任务要求没有改变。将任务代码2的depends顺序(依赖顺序交换)看看结果怎样?执行结果2:Buildfile: D:build.xmlinit: mkdir Created dir: D:JAVAMyEclipseWorkAntbuildclasses mkdir Created dir: D:JAVAMyEclipseWorkAntbuilddistclean: delete Deleting directory D:JAVAMyEclipseWorkAntbuildclasses delete Deleting directory D:JAVAMyEclipseWorkAntbuilddistcompile:BUILD FAILEDD:build.xml:8: destination directory D:buildclasses does not exist or is not a directoryTotal time: 482 milliseconds解释:因为clean依赖init,执行init、clean后目录已经不存在,并且deploy间接依赖init,init中的任务定义与上一次执行init相比没有发生变化,所以init不再执行(自己想的是这样)。deploy和compile依赖的目录不存在,所以会构建失败。任务代码3 init invoked! compile invoked! archive invoked! 执行结果:Buildfile: D:JAVAMyEclipseWorkAntbuild-execute-order.xmlinit: echo init invoked! mkdir Created dir: D:JAVAMyEclipseWorkAntinitcompile: echo compile invoked! mkdir Created dir: D:JAVAMyEclipseWorkAntcompilearchive: echo archive invoked! mkdir Created dir: D:JAVAMyEclipseWorkAntarchiveclean: delete Deleting directory D:JAVAMyEclipseWorkAntinitall:BUILD SUCCESSFULTotal time: 521 milliseconds 解释:以上任务代码2定义all依赖archive和clean,其中archive间接依赖于init,clean也依赖于init。在archive后clean前没有执行init是因为在archive依赖的init已经执行,clean依赖的init准备执行的时候发现init已经执行所以就不再重复执行。任务代码4 init invoked! compile invoked! archive invoked! 执行结果Buildfile: D:JAVAMyEclipseWorkAntbuild-execute-order.xmlinit: echo init invoked! mkdir Created dir: D:JAVAMyEclipseWorkAntinitclean: delete Deleting directory D:JAVAMyEclipseWorkAntinitcompile: echo compile invoked!archive: echo archive invoked!all:BUILD SUCCESSFULTotal time: 512 milliseconds解释:任务代码3将all依赖的clean和archive相对与代码2交换位置,执行结果显示archive间接依赖的init没有执行,因为在clean依赖的init已经执行。Ant默认对于执行过的任务如果任务要求没有改变就不会重复执行。所以在compile之前init没有得到执行。 任务代码5 init invoked! compile invoked! archive invoked! 执行结果Buildfile: D:JAVAMyEclipseWorkAntbuild-execute-order2.xmlinit: echo init invoked! mkdir Created dir: D:JAVAMyEclipseWorkAntinitclean: delete Deleting directory D:JAVAMyEclipseWorkAntinitcompile: echo compile invoked!archive: echo archive invoked!all:BUILD SUCCESSFULTotal time: 521 milliseconds解释:同任务代码3,这里在archive和compile中都加入删除init目录的操作。因为clean中已经将目录删除,所以compile和archive中没有输出删除init目录的信息。虽然init目录已经不存在,但是还是会构建成功,这是因为Ant认为init已经执行所以不再重复。再来看下面的任务定义和执行结果。在init中创建两个目录:init和init2,在clean中删除目录init,在compile中删除init2,在archive中删除init2,分析执行结果。任务代码5 init invoked! compile invoked! archive invoked! 执行结果Buildfile: D:JAVAMyEclipseWorkAntbuild-execute-order2.xmlinit: echo init invoked! mkdir Created dir: D:JAVAMyEclipseWorkAntinit mkdir Created dir: D:JAVAMyEclipseWorkAntinit2clean: delete Deleting directory D:JAVAMyEclipseWorkAntinitcompile: echo compile invoked! delete Deleting directory D:JAVAMyEclipseWorkAntinit2archive: echo archive invoked!all:BUILD SUCCESSFULTotal time: 495 milliseconds解释:不同于任务4,这里在init中创建两个目录:init和init2。在clean中删除目录init,在compile和archive中删除init2。Ant任务执行的顺序以及依赖任务的执行与否需要重点掌握。总之,Ant认为已经执行的任务,并且任务要求没有发生改变就不会重复执行任务。 Ant构建的时候是必须的并且ant构建文件的根元素总是,而且有且仅有一个元素,这也是xml语法的要求(有且仅有一个根元素),其他元素要包含在根元素之中。哪怕下没有任何元素,也是可以运行成功的。时间戳的生成在生成环境中使用当前时间和日期,以某种方式标记某个任务的输出,以便记录它是何时生成的,这经常是可取的。这可能涉及编辑一个文件,以便插入一个字符串来指定日期和时间,或将这个信息合并到jar或zip文件名中。这种需要是通过简单但是非常有用的tstamp任务来解决的。这个任务通常在某次生成过程开始时调用,比如在init目标中。这个任务不需要属性,许多情况下只需使用就足够了。tstamp不产生任何输出;相反,它根据当前系统时间和日期设置Ant属性。下面是tstamp设置的一些属性、对每个属性的说明以及这些属性可被设置到的值的例子。属性说明例子DSTAMP设置为当前日期,默认格式为yyyymmdd20120725TSTAMP设置为当前时间,默认格式为hhmm1753TODAY设置为当前日期,带完整月份2012年7月25日在调用tstamp任务后,我们能够根据日期命名该jar文件,如下所示:举例说明: 文件系统操作创建和删除目录:最基本的文件系统操作之一就是创建和删除目录。做这个任务的方式为:Mkdir任务的另一个有用特征是它在父目录还不存在的时候创建它们。(?)如果目标目录已经存在,mkdir任务不会发出错误消息,而只是假设它的工作已经完成从而什么也不做。删除目录: 这将删除指定的目录连同它包含的所有文件以及子目录。使用file属性而不是dir属性可以指定要删除的文件而不是目录。例如: 复制和移动文件及目录: 将file指定目录中的文件复制到tofile指定的目录中同时修改文件名;tofile也可以使用todir,todir就是拷贝不改名,tofile可以顺便修改文件名。Copy的默认如果任务定义不改变就不会重复执行,如果将copy的overwrite=true那么在每次运行ant的时候都会重新执行,即使重复。 实现移动文件,相当于剪切;同样有tofile和todir的区别。例如: 作用是修改文件名。默认情况下,Ant仅输出它执行的移动和复制等操作的摘要信息,包括诸如移动和复制文件的数量信息等。如果想看到更详细的信息,包括涉及的文件名称等,可以将verbose属性设置为true,verbose只在具体任务上而不是target上,例如:创建和解压缩ZIP文件,例如:将$classDir目录中的文件打包到$dist文件夹中命名为package.zip。解压缩和提取文件 ,还可以包括overwrite属性来控制覆盖行为。默认设置是覆
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第一节 足球说课稿-2025-2026学年高中体育人教版2019必修第一册-人教版
- 内蒙古自治区公考真题2025
- 诸神办事处求取上上签(说课稿)2025-2026学年初三下学期教育主题班会
- 橡胶厂加班申请管理制度
- 2025年上海市物业服务合同范本(合同版本)
- 化肥厂保养供应商评估规定
- 2025文艺活动策划委托合同
- 快递公司员工劳动合同协议
- 化肥原料采购质量保证合同协议
- Unit 4 Humour Lesson 2 Why do we need humour 教案 -2024-2025学年高中英语北师大版(2019)选择性必修第二册
- 事业法人登记管理办法
- 承装修试许可证管理办法
- 2025楼宇平方效益评价规范
- 术后并发症护理
- 第9课《天上有颗“南仁东星”》课件 2025-2026学年统编版八年级语文上册
- 餐饮服务食品安全常规项目自查记录表
- 粪污清运服务管理制度
- 医疗机构动火管理制度
- 孵化基地制度管理制度
- 中枢整合康复技术课件
- DB31/T 936-2015车载终端与手机互联应用规范第1部分:通用技术规范
评论
0/150
提交评论