属性元素ANT速写

最近使用开发的过程中涌现了一个小问题,顺便记录一下原因和方法--属性元素

     

    一、为什么使用ANT

    当一个代码项目大了以后,每次重新编译,打包,测试等都市变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量实现。在Java 中应用是平台无关性的,当然不会用平台相关的make脚本来实现这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序实现项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来讲还要好维护一些。

    观点到处都是,到处可查。ant就是一个构建工具,又不局限于构建。

 

    什么是构建?

    形象来讲,就是把代码从某个地方拿来,编译,再拷贝到某个地方去运行等等操纵。

 

    什么叫不局限于构建?

    ant重要用来做构建,但它能做的还有很多,可能你用了很久,依然不知道它到底有多少功能。ant插件让ant的功能丰富多彩,例如我们前面演示的“生成hibernate映射文件,配置文件”等

 

    准备工作:

    1、安装jdk,配置java_home,path,class_path。如果你连这些还不清晰,那就先不要学ant了。

    2、下载解压ant,搜ant,官网下载,然后解压即可。我这里用的是1.9.0

    3、设置ant_home,path中添加ant_home下的bin

    4、开始-运行-cmd-ant-回车

    如果看到Buildfile:build.xml does not exist! bulid failed

    那么表现ant安装成功!

 

    二、ANT测试

    1、基本元素

    bulid.xml

<?xml version="1.0" encoding="GBK"?>
<project name="ant测试" default="getBaseDir"  basedir="D:\antTest">
	
	
	<!--基本元素-->
	<target name="getBaseDir">
		 <description>  
           the first example!  
        </description>  
		<echo message="hello world!" />
	</target>
	
	<target name="targetA" if ="ant.version">  
        <echo message ="Java Version: ${ant.version}"/>  
    </target>  
	
	<target name="targetB" if ="ant.java.version">  
        <echo message ="Java Version: ${ant.java.version}"/>  
		<echo message ="Java Version: ${ant.file}"/>  
		<echo message ="Java Version: ${ant.version}"/>  
    </target> 
	
	
    <target name="targetC"  depends ="targetA" unless ="anotherTarget" >  
        <description>  
            show depends,unless,basedir,if
        </description>  
        <echo message ="The base dir is: ${basedir}"/>  
    </target>  
    
	<!--property-->
	<property name="name" value="jim" />
	<property name="age" value="18" />
	
	
	<target name="targetD" >
		<echo message="name:${name},age:${age}" />
	</target>

	<!--echo-->
	<target name="targetEcho">
		<echo message="Hello,ANT" file="herfile/hello.log" append="true" /> 
	</target>
	
</project>

    
 project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会产生错误。在每个 project 元素下,可包含多个 target 元素。

    1) name 属性

    用于指定 project 元素的名称。

    2) default 属性

    用于指定 project 默许执行时所执行的 target 的名称。

    3) basedir 属性

    用于指定基路径的位置。该属性没有指准时,使用 Ant 的构件文件的附目录作为基准目录。

 

    target 元素

   target为Ant的基本执行单元,它可以包含一个或多个详细的任务。多个target 可以存在相互依附关系。它有如下属性:

    1) name 属性

    指定 target 元素的名称,这个属性在一个 project 元素中是唯一的。我们可以通过指定 target 元素的名称来指定某个 target 。

    2) depends 属性

    用于描述 target 之间的依附关系,若与多个 target 存在依附关系时,需要以“,”距离。 Ant 会依照 depends 属性中 target 涌现的顺序顺次执行每个 target 。被依附的 target 会先执行。

    3) if 属性

    用于验证指定的属性是不是存在,若不存在,地点 target 将不会被执行。

    4) unless 属性

    该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是不是存在,若不存在,地点 target 将会被执行。

    5) description 属性

    该属性是关于 target 功能的简短描述和说明。

    property 元素

    property元素可看作参量或者参数的定义,project 的属性可以通过 property 元素来设定,也可在 Ant 以外设定。若要在外部引入某文件,例如 build.properties 文件,可以通过如下内容将其引入:

    <property

    

    file=” build.properties”/>

    

    

property 元素可用作 task 的属性值。在 task 中是通过将属性名放在“ ${ ”和“ } ”之间,并放在 task 属性值的位置来实现的。

 

    2、经常使用命令

    build.xml

<?xml version="1.0" encoding="GBK"?>
<project name="ant测试" default="getBaseDir"  basedir="D:\antTest">
	<!--经常使用命令-->
	
	<!--copy-->
	<target name="targetCopy">
		<copy file="myfile/hello.txt" tofile="herfile/copied.txt"/> 
        <copy todir="hisfile"> <fileset dir="myfile"/></copy> 
	</target>
	
	<!--delete-->
	<target name="targetDelete">
		<delete file="myfile/hello.txt" />
		<delete dir="myfile" />
		<delete includeEmptyDirs="true">
			<fileset dir="." includes="**/*.bak" />
		</delete>
 	</target>
	
	<!--mkdir-->
	<target name="targetMkdir">
		<mkdir dir="/myfile/src/build/classes"/> 
	</target>
	
	<!--move-->
	<target name="targetMove">
		<move file="destfile.txt" tofile="hello.txt"/> 
		<move file="hello.txt" todir="myfile"/> 
		<move todir="herfile"> <fileset dir="myfile"/></move>
	</target>
	

</project>

    
copy命令用来对文件和目录的复制功能。

    每日一道理
只有启程,才会到达理想和目的地,只有拼搏,才会获得辉煌的成功,只有播种,才会有收获。只有追求,才会品味堂堂正正的人。

    delete 命令对文件或目录进行删除

    mkdir 命令创建目录

    move 命令移动文件或目录

 

    3、经常使用target

    举例:j2ee项目打包宣布,hibernate相关文件生成

<?xml version="1.0" encoding="GBK"?>
<project name="测试ANT"  basedir=".">
   
	
    <!--资源文件位置-->
	<property name="src.dir" value="${basedir}/src" />
    <!--编译的目标位置-->
	<property name="classes" value="${basedir}/build/classes" />
	<!--打包的目标位置-->
	<property name="build" value="${basedir}/build" />
	<!--Lib的位置-->
	<property name="lib" value="${basedir}/WebContent/WEB-INF/lib" />
    <!--tomcat.webapps位置-->
	<property name="webapps" value="D:/tomcate/apache-tomcat-7.0.39/webapps" />
	<!--Xdoclet.Home-->
	<property name="xdoclet.home" value="D:/oa/xdoclet-plugins-1.0.3" />	
		
		<!-- Build classpath 指定定lib地点位置-->
		<path id="classpath">
			<fileset dir="${lib}">
				<include name="*.jar" />
			</fileset>
		</path>

		<!--  删除build 路径-->
		<target name="删除build 路径">
			<delete dir="${build}" />
		</target>

		<!--  建立build/classes 路径,并编译class 文件到build/classes 路径下-->
		<target name="建立build/classes 路径,并编译class 文件到build/classes 路径下" depends="删除build 路径">
			<mkdir dir="${classes}" />
			<javac srcdir="${basedir}/src" destdir="${classes}">
				<classpath refid="classpath" />
			</javac>
			<copy todir="${classes}">
				<fileset dir="${src.dir}">
					<include name="**/*.xml" />
					<include name="**/*.properties" />
				</fileset>
			</copy>

		</target>

		<!-- 打war 包-->
		<target name="打war 包" depends="建立build/classes 路径,并编译class 文件到build/classes 路径下">
			<war destfile="${build}/WebTest1.war" webxml="${basedir}/WebContent/WEB-INF/web.xml">

				<!--  拷贝WebContent下所有文件-->
				<fileset dir="${basedir}/WebContent" />

				<!--  拷贝lib 目录下的jar 包-->
				<lib dir="${lib}" />
				<!--  拷贝build/classes 下的class 文件-->
				<classes dir="${classes}" />

			</war>

			<delete dir="${classes}" />

		</target>

        <!--宣布到本地tomcat-->
		<target name="宣布到本地tomcat" depends="打war 包">
			<copy file="${build}/WebTest1.war" tofile="${webapps}/WebTest1.war" />
		</target>
	

		<!-- Build classpath -->
		<path id="xdoclet.task.classpath">
			<fileset dir="${xdoclet.home}/lib">
				<include name="**/*.jar" />
			</fileset>
			<fileset dir="${xdoclet.home}/plugins">
				<include name="**/*.jar" />
			</fileset>
		</path>

		<taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.task.classpath" />
         
		<!--生成Hibernate配置文件-->
		<target name="生成Hibernate配置文件" depends="生成hibernate映射文件">
			<xdoclet>
				<fileset dir="${src.dir}/com/jialin/model">
					<include name="**/*.java" />
				</fileset>
				<component classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin" destdir="${src.dir}" version="3.0" hbm2ddlauto="update" jdbcurl="jdbc:mysql://127.0.0.1/oa" jdbcdriver="com.mysql.jdbc.Driver" jdbcusername="root" jdbcpassword="123456" dialect="org.hibernate.dialect.MySQLDialect" showsql="true" />
			</xdoclet>
		</target>
		
		<!--生成hibernate映射文件-->
		<target name="生成hibernate映射文件">
			<xdoclet>
				<fileset dir="${src.dir}/com/jialin/model">
					<include name="**/*.java" />
				</fileset>
				<component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin" version="3.0" destdir="${src.dir}" />
			</xdoclet>
		</target>
	</project>

    
说明见注释吧。

    注:在eclipse里边先天支持ant,所以你可以在eclipse里边直接写build.xml,因为eclipse提供了提示功能,自动补充功能,它能让你事半功倍。
使用方法:只需要建立一个工程,然后建立一个叫build.xml的文件。然后就可以在里边写你的ant build了。

 

    总结:

    掌握了上边的那些内容之后,你就知道如何去写一个好的ant,但是你会发现当你真的想去做的时候,你不能马上作出好的build.xml,因为你知道太少的ant
的默许提供的命令.这个时候如果你想实现任务,并提高自己,有很多办法:

 
1、很多开源的程序都带有build.xml,看看它们如何写的
2、ant的document,里边详细列写了ant的各种默许命令,及其丰富
3、google,永远不要忘记它
4、时刻记住http://www.apache.org/永远能找到你需要的东西

 

    随着你写的ant build越来越多,你知道的命令就越多,ant在你的手里也就越来越强大了,这个是一个慢慢积累的过程。  

 

    
 

 

文章结束给大家分享下程序员的一些笑话语录: 话剧:程序员过沟
  本剧内容纯属虚构,如有雷同……HEHE……俺也没办法了。
  话说某市街道改建,某某软件公司门口横七竖八挖了几条大沟。一群程序员(SDK程序员赵某,VB程序员钱某,VC程序员孙某,DELPHI程序员李某)下班从公司里出来,看到门前的几条沟,于是各显神通……门前第一条沟也就半米来宽,SDK程序员赵某二话没说,轻轻一跃跳了过去,看到其它人纷纷把随身携带的公文包(类库)横在沟上踩着过沟,不屑地说,这么小一条沟,犯得着小题大做用那个吗?看我多么轻松多么洒脱多么……多么……(众人皆怒目横视之……)
  接着第二条沟有点宽度。SDK程序员赵某还是还是一马当先,飞跃而起……不好,还差一点才到……幸好凭着多年的(跳远?编程?)经验,单手抓住沟沿,颤巍巍地爬了上来,嘴里还念念有词“高手就是高手啊,虽然差一点就……不过毕竟……HEHE……跳远是过沟的基础嘛,有基础(SDK)就有一切的说……”(众人作瞠目结舌状……)看到别人跳过去了,可自己又跳不了那么远,只好再想办法了……VB程序员钱某,DELPHI程序员李某打开手提,连上手机,开始上网找可供过沟的控件……VC程序员孙某却不慌不忙,打开公文包,把几块衬板拆了下来,然后三下五除二拼成一个简易木桥……“虽然这几个板子(类)做得不怎么样,不过先把这个项目应付过去,有时间我自己做一个好了……”于是踩着板子过了沟。
  这时钱某和李某也分别找到了合适的东东。钱某找到的是“钢丝绳.ocx”,安装简单,使用方便,拉出一头,对孙某说“大虾,顺手拉兄弟一把……”,于是把绳子系在沟两边的绿化树木上,踩着钢丝就过了沟。刚刚站稳就四方作揖,“小生这里有礼了”。这时一戴着黄袖圈的老太太跳了出来,抓住钱某,“破坏绿化树木,罚款XXXX元,交钱,交钱,交钱!”(老人家作双枪老太婆怒视伪军状
……钱某被逼无奈,只好边掏钱,边对着后台叫道“导演,我这可是因公牺牲,不给个烈士称号也得报销”,后台一个臭鸡蛋飞出,“叫什么叫,我这个月的粮饷还不知哪里去领呢,都什么时代了,你不下岗都不错了……”)
  李某看着刚刚好不容易从台湾拖回来的“铝条.ZIP”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值