MyEclipse使用Ant打包项目
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MyEclipse使用Ant打包项目,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含17252字,纯文字阅读大概需要25分钟。
内容图文
![MyEclipse使用Ant打包项目](/upload/InfoBanner/zyjiaocheng/1217/77efbdbdcdee45ba9c42a93fc9ef23c5.jpg)
本章主要介绍如何使用ant打包发布项目。
ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。在实际软件开发中,有很多地方可以用到ant。
优点
ant 是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点:
1、跨平台性:Ant是纯Java语言编写的,所以具有很好的跨平台性。
2、操作简单:Ant是由一个内置任务和可选任务组成的,用ant任务就像是在dos中写命令行一样。Ant运行时需要一个XML文件(构建文件)。 Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。
3、维护简单、可读性好、集成简单:由于Ant构建文件 时XML格式的文件,所以很容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
ant可以使用单独的ant安装,或者直接使用IDE集成的ant插件(我们只需要写ant的build.xml文件就可以执行ant打包任务)
以下是Java的Web项目实例程序,通过使用Myeclipse集成的ant执行打包任务,主要介绍build.xml配置规则。
代码结构:
关键代码:
build.properties
#appserver.lib是tomcat的library appserver.lib=D\:\\library\\develop\\tomcat6\\lib #antwebproj.lib是antproj项目的library antwebproj.lib=D\:\\library\\develop\\struts2\\base #项目打包版本 version.num=1.0
build.xml
<? xml version="1.0" encoding="UTF-8" ?> < project basedir ="." default ="usage" name ="antproj" > <!-- 引入配置文件 --> < property file ="build.properties" /> <!-- 配置引用属性 --> < property name ="src.dir" value ="src" /> < property name ="config.dir" value ="config" /> < property name ="build.dir" value ="build" /> < property name ="web.dir" value ="WebRoot" /> < property name ="name" value ="antproj" /> < path id ="master-classpath" > <!-- We need the servlet API classes: --> <!-- * for Tomcat 5/6 use servlet-api.jar --> <!-- * for other app servers - check the docs --> < fileset dir ="${appserver.lib}" > < include name ="*.jar" /> </ fileset > < fileset dir ="${antwebproj.lib}" > < include name ="*.jar" /> </ fileset > < pathelement path ="${build.dir}" /> </ path > < target name ="usage" > <!-- 输出信息到控制台中 --> < echo message ="" /> < echo message ="${name} build file" /> < echo message ="-----------------------------------" /> < echo message ="" /> < echo message ="Available targets are:" /> < echo message ="" /> < echo message ="build --> Build the application" /> < echo message ="" /> </ target > <!-- 编译生成class文件 --> < target name ="build" description ="Compile main source tree java files" > <!-- 删除编译存放的classes文件 --> < delete dir ="${build.dir}/classes" ></ delete > <!-- 新建编译存放的classes文件 --> < mkdir dir ="${build.dir}/classes" /> < copy todir ="${build.dir}/classes" > <!-- 将项目中除会编译生成class文件的java文件之外其他类型的文件拷贝到对应的目录下,指定文件名后缀 --> < fileset dir ="${src.dir}" > < include name ="**/*.properties" /> < include name ="**/*.xml" /> <!-- 这个是不包含 <exclude/> --> </ fileset > < fileset dir ="${config.dir}" > < include name ="**/*.properties" /> < include name ="**/*.xml" /> </ fileset > </ copy > <!-- java编译 --> < javac destdir ="${build.dir}/classes" source ="1.5" target ="1.5" debug ="true" deprecation ="false" optimize ="false" failonerror ="true" encoding ="utf-8" > < src path ="${src.dir}" /> <!-- 编译所需要的jar包路径 --> < classpath refid ="master-classpath" /> </ javac > </ target > < target name ="jar" depends ="build" description ="Compress the java class files to jar" > < mkdir dir ="${build.dir}/jar" /> < delete file ="${build.dir}/jar/${name}.jar" /> < buildnumber file ="${build.dir}/buildnum.txt" /> <!-- 指定时间戳 可以调用TODAY --> < tstamp > < format property ="TODAY" pattern ="yyyy-MM-dd HH:mm:ss" /> </ tstamp > <!-- 生成清单文件 --> < manifest file ="${build.dir}/MANIFEST.MF" > < attribute name ="Built-By" value ="${user.name}" /> < attribute name ="Implementation-Version" value ="${version.num}.${build.number}" /> < attribute name ="Built-Date" value ="${TODAY}" /> </ manifest > <!-- 打包jar --> <!-- includes 包含哪些后缀文件 空格分隔 --> < jar destfile ="${build.dir}/jar/${name}.jar" basedir ="${build.dir}/classes" includes ="**/*.class **/*.properties **/*.xml" manifest ="${build.dir}/MANIFEST.MF" > < zipfileset dir ="${antwebproj.lib}" > < include name ="*.jar" /> </ zipfileset > </ jar > </ target > <!-- depends指的是执行该任务,会先执行那个任务 --> < target name ="deploywar" depends ="build" description ="Deploy application as a WAR file" > <!-- 指定时间戳 可以调用VERSIONDAY --> < tstamp > < format property ="VERSIONDAY" pattern ="yyyyMMdd" /> </ tstamp > < delete file ="${build.dir}/war/${name}.war" /> <!-- 删除WEB路径下的jar包 --> < delete file ="${web.dir}/WEB-INF/lib/*.jar" /> < mkdir dir ="${build.dir}/war" /> < copy overwrite ="true" todir ="${web.dir}/WEB-INF/lib" > <!-- 将实际的jar包拷到WEB路径下 --> < fileset dir ="${antwebproj.lib}" > < include name ="*.jar" /> </ fileset > </ copy > <!-- 将之前编译生成的classes路径下的编译结果拷贝到WEB路径下 --> < copy todir ="${web.dir}/WEB-INF/classes" overwrite ="true" > < fileset dir ="${build.dir}/classes" ></ fileset > </ copy > <!-- 删除版本文件 --> < delete file ="${src.dir}/com/alfred/VersionResources.properties" /> <!-- 重新写入版本文件 --> < echo file ="${web.dir}/WEB-INF/classes/com/alfred/VersionResources.properties" message ="antproj.version=v${version.num}.${build.number}.${VERSIONDAY}" /> < echo file ="${src.dir}/com/alfred/VersionResources.properties" message ="antproj.version=v${version.num}.${build.number}.${VERSIONDAY}" /> <!-- 打包war --> < war destfile ="${name}.war" webxml ="${web.dir}/WEB-INF/web.xml" > < fileset dir ="${web.dir}" > <!-- 包括哪些文件 --> < include name ="**/*.*" /> <!-- 不包括哪些文件 --> < exclude name ="**/documents/**" /> < exclude name ="**/logs/*.log" /> </ fileset > </ war > <!-- 将war包拷贝到build的war目录下 --> < copy todir ="${build.dir}/war" preservelastmodified ="true" > < fileset dir ="." > < include name ="*.war" /> </ fileset > </ copy > < delete > < fileset file ="${web.dir}/WEB-INF/lib/*.jar" /> < fileset file ="./*.war" /> < fileset dir ="${build.dir}/classes" includes ="**/*.*" /> </ delete > </ target > < target name ="cleanup" > <!-- 删除编译文件夹下的所有文件(不包括编译文件夹下的文件夹) <delete> <fileset dir="${build.dir}/classes" includes="**/*.*" /> </delete> --> <!-- 删除编译文件夹 --> < delete dir ="${build.dir}/classes" /> </ target > </ project >
右键build.xml执行jar和deploywar任务后,在build目录下生成jar包以及war包,打包结果如下:
ant脚本说明:使用节点、元素和属性、命令指令
1、project 节点元素
project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会发生错误。在每个 project 元素下,可包含多个 target 元素。接下来向读者展示一下 project 元素的各属性。
● name 属性:用于指定 project 元素的名称。
● default 属性:用于指定 project 默认执行时所执行的 target 的名称。
● basedir 属性:用于指定基路径的位置。该属性没有指定时,使用 Ant 的构件文件的附目录作为基准目录。
<? xml version="1.0" ?> < project name ="ant-project" default ="print-dir" basedir ="." > < target name ="print-dir" > < echo message ="The base dir is: ${basedir}" /> </ target > </ project >
2、target节点元素
target为ant的基本执行单元或是任务,它可以包含一个或多个具体的单元/任务。多个target 可以存在相互依赖关系。它有如下属性:
● name 属性:指定 target 元素的名称,这个属性在一个 project 元素中是唯一的。我们可以通过指定 target 元素的名称来指定某个 target 。
● depends 属性:用于描述 target 之间的依赖关系,若与多个 target 存在依赖关系时,需要以“,”间隔。 Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target ,被依赖的target 会先执行。
● if 属性:用于验证指定的属性是存在,若不存在,所在 target 将不会被执行。
● unless 属性:该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行。
● description 属性:该属性是关于 target 功能的简短描述和说明。
<? xml version="1.0" ?> < project name ="ant-target" default ="print" > < target name ="version" if ="ant.java.version" > < echo message ="Java Version: ${ant.java.version}" /> </ target > < target name ="print" depends ="version" unless ="docs" > < description > a depend example! </ description > < echo message ="The base dir is: ${basedir}" /> </ target > </ project >
运行的是名为 print的target ,由于它依赖于version这个target任务,所以 version将首先被执行,同时因为系统配置了JDK,所以 ant.java.version 属性存在,执行了version,输出信息:"[echo] Java Version: 1.6 ",version执行完毕后,接着执行 print,因为docs不存在,而unless属性是在不存在时进入所在target 的,由此可知 print得以执行。
3、property属性节点元素
property元素可看作参量或者参数的定义,project 的属性可以通过 property 元素来设定,也可在 Ant 之外设定。若要在外部引入某文件,例如 build.properties 文件,可以通过如下内容将其引:
<property file="build.properties"/>
property 元素可用作 task 的属性值。在 task 中是通过将属性名放在${属性名}之间,并放在 task 属性值的位置来实现的。
Ant 提供了一些内置的属性,它能得到的系统属性的列表与 Java 文档中 System.getProperties() 方法得到的属性一致,这些系统属性可参考 sun 网站的说明。同时, Ant 还提供了一些它自己的内置属性,如下:
basedir: project 基目录的绝对路径;
ant.file: buildfile的绝对路径;
ant.version: Ant 的版本信息;
ant.project.name: 当前指定的project的名字,即前文说到的project的name属性值;
ant.java.version: Ant 检测到的JDK版本,本文为 1.6 。
< project name ="ant-project" default ="example" > < property name ="name" value ="jojo" /> < property name ="age" value ="25" /> < target name ="example" > < echo message ="name: ${name}, age: ${age}" /> </ target > </ project >
4、copy命令
copy主要用来对文件和目录的复制功能。举例如下:
● 复制单个文件:
<copy file="old.txt" tofile="new.txt"/>
● 对文件目录进行复制:
<copy todir="../dest_dir">
<fileset dir="src_dir"/>
</copy>
● 将文件复制到另外的目录:
<copy file="src.txt" todir="c:/base"/>
5、delete命令
对文件或目录进行删除,举例如下:
● 删除某个文件:
<delete file="/res/image/cat.jpg"/>
● 删除某个目录:
<delete dir="/res/image"/>
● 删除所有的jar文件或空目录:
<delete includeEmptyDirs="true">
<fileset dir="." includes="**/*.jar"/>
</delete>
6、 mkdir 命令
创建目录。
<mkdir dir="/home/philander/build/classes"/>
7、 move 命令
移动文件或目录,举例如下:
● 移动单个文件:
<move file="sourcefile" tofile=”destfile”/>
● 移动单个文件到另一个目录:
<move file="sourcefile" todir=”movedir”/>
● 移动某个目录到另一个目录:
<move todir="newdir">
<fileset dir="olddir"/>
</move>
8、echo 命令
该任务的作用是根据日志或监控器的级别输出信息。它包括 message 、 file 、 append 和 level 四个属性,举例如下
<echo message="ant message" file="/logs/ant.log" append="true">
9、jar 标签节点元素
该标签用来生成一个JAR文件,其属性如下。
● destfile表示JAR文件名。
● basedir表示被归档的文件名。
● includes表示别归档的文件模式。
● exchudes表示被排除的文件模式。
● compress表示是否压缩。
< jar destfile ="${webRoot}/${ash_jar}" level ="9" compress ="true" encoding ="utf-8" basedir ="${dest}" > < manifest > < attribute name ="Implementation-Version" value ="Version: 2.2" /> </ manifest > </ jar >
上面的mainfest是jar包中的MEAT-INF中的MANIFEST.MF中的文件内容
同样打包操作的的还有war、tgz,已经解压操作uzip
<!-- 创建zip --> < zip basedir ="${basedir}\classes" zipfile ="temp\output.zip" /> <!-- 创建tgz --> < gzip src ="classes\**\*.class" zipfile ="output.class.gz" /> <!-- 解压zip --> < unzip src ="output.class.gz" dest ="extractDir" /> <!-- 建立war包 --> < war destfile ="${webRoot}/ash.war" basedir ="${basedir}/web" webxml ="${basedir}/web/WEB-INF/web.xml" > < exclude name ="WEB-INF/classes/**" /> < exclude name ="WEB-INF/lib/**" /> < exclude name ="WEB-INF/work/_jsp/**" /> < lib dir ="${lib.dir}" includes ="**/*.jar, **/*.so, **/*.dll" > < exclude name ="${webRoot}\${helloworld_jar}" /> </ lib > < lib file ="${webRoot}/${helloworld_jar}" /> < classes dir ="${dest}" includes ="**/*.xml, **/*.properites, **/*.xsd" > </ classes > </ war >
10、javac 标签节点元素
该标签用于编译一个或一组java文件,其属性如下。
● srcdir表示源程序的目录。
● destdir表示class文件的输出目录。
● include表示被编译的文件的模式。
● excludes表示被排除的文件的模式。
● classpath表示所使用的类路径。
● debug表示包含的调试信息。
● optimize表示是否使用优化。
● verbose 表示提供详细的输出信息。
● fileonerror表示当碰到错误就自动停止。
< javac srcdir ="${src}" destdir ="${dest}" /> <!-- 设置jvm内存 <javac srcdir="src" fork="true"/> <javac srcdir="src" fork="true" executable="d:\sdk141\bin\javac" memoryMaximumSize="128m"/> -->
11、java 标签节点元素
该标签用来执行编译生成的.class文件,其属性如下。
● classname 表示将执行的类名。
● jar表示包含该类的JAR文件名。
● classpath所表示用到的类路径。
● fork表示在一个新的虚拟机中运行该类。
● failonerror表示当出现错误时自动停止。
● output 表示输出文件。
● append表示追加或者覆盖默认文件。
< java classname ="com.hoo.test.HelloWorld" classpath ="${hello_jar}" />
12、arg 数据参数元素
由Ant构建文件调用的程序,可以通过<arg>元素向其传递命令行参数,如apply,exec和java任务均可接受嵌套<arg>元素,可以为各自的过程调用指定参数。以下是<arg>的所有属性。
● values 是一个命令参数。如果参数中有空格,但又想将它作为单独一个值,则使用此属性。
● file 表示一个参数的文件名。在构建文件中,此文件名相对于当前的工作目录。
● line 表示用空格分隔的多个参数列表。
● 表示路径,一个作为单个命令行变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。
● pathref 引用的path(使用path元素节点定义path)的id
● prefix 前缀
● suffix 后缀
<!-- 一个含有空格的单个的命令行变量。 --> < arg value ="-l -a" /> <!-- 两个空格分隔的命令行变量。 --> < arg line ="-l -a" /> <!-- 一个命令行变量,其值在DOS系统上为\dir;\dir2;\dir3;在Unix系统上为/dir:/dir2:/dir3 。 --> < arg path ="/dir;/dir2:\dir3" />
13、ervironment 类型
由Ant构建文件调用的外部命令或程序,<env>元素制定了哪些环境变量要传递给正在执行的系统命令,<env>元素可以接受以下属性。
● file表示环境变量值的文件名。此文件名要被转换位一个绝对路径。
● path表示环境变量的路径。Ant会将它转换为一个本地约定。
● value 表示环境变量的一个直接变量。
● key 表示环境变量名。
注意 file path 或 value只能取一个。
14、filelist 文件集合列表
filelist 是一个支持命名的文件列表的数据类型,包含在一个filelist类型中的文件不一定是存在的文件。以下是其所有的属性。
● dir是用于计算绝对文件名的目录。
● files 是用逗号分隔的文件名列表。
● refid 是对某处定义的一个<filelist>的引用。
注意 dir 和 files 都是必要的,除非指定了refid(这种情况下,dir和files都不允许使用)。
< filelist id ="docfiles" dir ="${doc.src}" files ="foo.xml,bar.xml" /> <!-- 文件集合 ${doc.src}/foo.xml和${doc.src}/bar.xml. 这些文件也许还是不存在的文件. --> < filelist id ="docfiles" dir ="${doc.src}" files ="foo.xml bar.xml" /> < filelist refid ="docfiles" /> < filelist id ="docfiles" dir ="${doc.src}" > < file name ="foo.xml" /> < file name ="bar.xml" /> </ filelist >
15、fileset 文件类型
fileset 数据类型定义了一组文件,并通常表示为<fileset>元素。不过,许多ant任务构建成了隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。以下为fileset 的属性列表。
● dir表示fileset 的基目录。
● casesensitive的值如果为false,那么匹配文件名时,fileset不是区分大小写的,其默认值为true.
● defaultexcludes 用来确定是否使用默认的排除模式,默认为true。
● excludes 是用逗号分隔的需要派出的文件模式列表。
● excludesfile 表示每行包含一个排除模式的文件的文件名。
● includes 是用逗号分隔的,需要包含的文件模式列表。
● includesfile 表示每行包括一个包含模式的文件名。
< fileset id ="lib.runtime" dir ="${lib.path}/runtime" > < include name ="**/*.jar" /> < include name ="**/*.so" /> < include name ="**/*.dll" /> </ fileset > < fileset id ="lib.container" dir ="${lib.path}/container" > < include name ="**/*.jar" /> </ fileset > < fileset id ="lib.extras" dir ="${lib.path}" > < include name ="test/**/*.jar" /> </ fileset >
16、patternset 类型
fileset 是对文件的分组,而patternset是对模式的分组,他们是紧密相关的概念。
<patternset>支持4个属性:includes、excludex、includexfile、excludesfile,这些与fileset相同。
patternset 还允许以下嵌套元素:include,exclude,includefile 和 excludesfile.
<!-- 黑白名单 --> < patternset id ="non.test.sources" > < include name ="**/*.java" /> <!-- 文件名包含Test的排除 --> < exclude name ="**/*Test*" /> </ patternset > < patternset id ="sources" > < include name ="std/**/*.java" /> <!-- 判断条件 存在professional就引入 --> < include name ="prof/**/*.java" if ="professional" /> < exclude name ="**/*Test*" /> </ patternset > <!-- 一组文件 --> < patternset includesfile ="some-file" /> < patternset > < includesfile name ="some-file" /> < patternset /> < patternset > < includesfile name ="some-file" /> < includesfile name ="${some-other-file}" if ="some-other-file" /> < patternset />
17、filterset 类型
filterset定义了一组过滤器,这些过滤器将在文件移动或复制时完成文件的文本替换。
主要属性如下:
● begintoken 表示嵌套过滤器所搜索的记号,这是标识其开始的字符串。
● endtoken 表示嵌套过滤器所搜索的记号这是标识其结束的字符串。
● id 是过滤器的唯一标志符。
● refid 是对构建文件中某处定义一个过滤器的引用。
<!-- 将目标文件build.dir目录中的version.txt文件内容中的@DATE@替换成TODAY当前日期的值,并把替换后的文件存放在dist.dir目录中 --> < copy file ="${build.dir}/version.txt" toFile ="${dist.dir}/version.txt" > < filterset > < filter token ="DATE" value ="${TODAY}" /> </ filterset > </ copy > <!-- 自定义变量的格式 --> < copy file ="${build.dir}/version.txt" toFile ="${dist.dir}/version.txt" > <!-- 从version.txt中的%位置开始搜索,到*位置结束,进行替换内容中的@DATE@替换成TODAY当前日期的值 --> < filterset begintoken ="%" endtoken ="*" > < filter token ="DATE" value ="${TODAY}" /> </ filterset > </ copy > <!-- 使用外部的过滤定义文件 --> < copy toDir ="${dist.dir}/docs" > < fileset dir ="${build.dir}/docs" > < include name ="**/*.html" > </ fileset > < filterset begintoken ="%" endtoken ="*" > <!-- 过来文件从外部引入,过来的属性和值配置在dist.properties文件中 --> < filtersfile file ="${user.dir}/dist.properties" /> </ filterset > </ copy > <!-- 使用引用方式,重复利用过滤集 --> < filterset id ="myFilterSet" begintoken ="%" endtoken ="*" > < filter token ="DATE" value ="${TODAY}" /> </ filterset > < copy file ="${build.dir}/version.txt" toFile ="${dist.dir}/version.txt" > < filterset refid ="myFilterSet" /> </ copy >
18、path类型
path元素用来表示一个类路径,不过它还可以用于表示其他的路径。在用作几个属性时,路经中的各项用分号或冒号隔开。在构建的时候,此分隔符将代替当前平台中所有的路径分隔符,其拥有的属性如下。
● location 表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。
● refid 是对当前构建文件中某处定义的一个path的引用。
● path表示一个文件或路径名列表。
< path id ="buildpath" > < fileset refid ="lib.runtime" /> < fileset refid ="lib.container" /> < fileset refid ="lib.extras" /> </ path > < path id ="src.paths" > < fileset id ="srcs" dir ="." > < include name ="src/**/*.java" /> </ fileset > </ path >
以上是部分ant的配置项说明,如果需要其他相关配置,可以查询ant的帮助文档。
原文:http://www.cnblogs.com/alfredinchange/p/5360972.html
内容总结
以上是互联网集市为您收集整理的MyEclipse使用Ant打包项目全部内容,希望文章能够帮你解决MyEclipse使用Ant打包项目所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。