<?xml version="1.0" encoding="UTF-8" ?>
<project name="ecp-oracle" basedir="." default="copyProjectToTomcat">
<property name="src" value="src"/>
<property name="dest" value="web/WEB-INF/classes"/>
<property name="build" value="../build"/>
<property name="project" value="ecp-oracle"/>
<property name="tomcat.webapp.dir" value="F:/apache-tomcat-6.0.29/webapps"/>
<property name="tomcat.project" value="*.war"/>
<property name="tomcat.dir" value="F:/apache-tomcat-6.0.29"/>
<!-- 指定编译所依赖的jar-->
<path id="project.classpath">
<fileset dir="web/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
</path>
<target name="init">
<tstamp/><!-- 生成时间戳 -->
<delete dir="${dest}" />
<mkdir dir="${dest}" />
<delete dir="${build}" />
<mkdir dir="${build}" />
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpath="svnant.jar"/><!-- 使用svn的支持 这里就要求svnant.jar在系统classpath中 -->
</target>
<target name="copy" depends="init">
<copy todir="${dest}">
<fileset dir="src/conf/"/>
</copy>
<!-- svn更新代码 -->
<target name="update" depends="init">
<svn username="pengch" password="123456">
<update dir="../${project}"/>
</svn>
</target>
</target>
<target name="compile" depends="copy">
<javac srcdir="${src}" destdir="${dest}" encoding="UTF-8">
<classpath refid="project.classpath"/>
</javac>
</target>
<target name="copy2" depends="compile">
<copy todir="${build}">
<fileset dir="web/"/>
</copy>
</target>
<target name="build" depends="copy2">
<jar jarfile="${project}-${DSTAMP}.war" basedir="${build}"/>
</target>
<target name="clean" depends="build">
<delete dir="${dest}"/>
<delete dir="${build}"/>
</target>
<!-- 拷贝项目到tomcat的webapps中 -->
<target name="copyProjectToTomcat" depends="clean">
<delete dir="${tomcat.webapp.dir}/${tomcat.project}" />
<copy todir="${tomcat.webapp.dir}/" file="${project}-${DSTAMP}.war"/>
</target>
<!-- 停止tomcat -->
<target name="stopTomcat">
<exec dir="${tomcat.dir}/bin" executable="cmd.exe" os="Windows XP">
<arg line="/c shutdown.bat" />
</exec>
</target>
<!-- 启动tomcat -->
<target name="startTomcat">
<exec dir="${tomcat.dir}/bin" executable="cmd.exe" os="Windows XP">
<arg line="/c startup.bat" />
</exec>
</target>
</project>
通过网上的资料以及自己的测试实践做出的第一个ant应用,这个应用的作用主要是完成支持svn更新项目、项目的打包及发布到tomcat服务器部署运行。
关于其每一句的详情解析在这就不废话了,因为之前转载了一篇适合初学者的ant实例有对每一句的详情讲解,在这就记录下我一步步下来遇到的一些问题及解决(注:我的项目是java project):
1、字符编码问题:javac编译时报“GBK不可映射字符”和“非法字符/65279”错误
GBK不可映射字符:<javac srcdir="${src}" destdir="${dest}" encoding="UTF-8"> 在此指定字符编码为“UTF-8”即可
非法字符/65279:用editplus打开所报文件 Document--File Encoding--Change File Encoding 此亦可选择多文件字符编码更改File Encoding Multiple修改为“UTF-8”保存即可
2、用ant编译时指定读取需要的项目lib下的jar包,所以需要配置classpath指定jar包的路径
设置classpath的方法有多种
<path id="project.classpath">
1<pathelement path="${basedir}/lib/aa.jar"/>
2<pathelement location="aa.jar"/>与1的区别在于location可以去当前路径,当然可以使用绝对路径
3<filelist id="file" dir="${basedir}/lin">
<file name="a.jar"/>
<file name="d:lib/b.jar"/>
</filelist>
4<fileset dir="d:/lib">
<include name="**/*.jar"/>
</fileset>
</path>
下面说classpath的使用
样例如下
<javac scdir="./src" destdir="./classes">
<classpath refid="project.classpath"/>
</javac>
下面是比较四种方式的优缺点
第一种调用的需要设置绝对路径适合第三方jar包
第二种则适合jar包和build.xml文件在同一目录下的情况,但是我觉得两个文件放在一起本身就不合理,估计是用的情况不多。
前两个都是设置单个jar包
第三种是一个文件集合适合引入不同路径的jar包,但是需要输入每个jar包的名字,比较繁琐,适合于jar包属于不同位置,比较分散但是不多的情况
第四种是一个文件夹,可以采用匹配模式来引入,这个适合在同一个文件夹下,文件名字比较多的情况下
3、打war包时追加当前时间命名文件( 生成时间戳):
这种需要是通过简单但是非常有用的 tstamp 任务来解决的。这个任务通常在某次生成过程开始时调用,比如在一个 init 目标中。这个任务不需要属性,许多情况下只需 <tstamp/> 就足够了。
tstamp 设置的属性:
属性 说明 例子
DSTAMP 设置为当前日期,默认格式为yyyymmdd 20031217
TSTAMP 设置为当前时间,默认格式为hhmm 1603
TODAY 设置为当前日期,带完整的月份 2003年12月17日
将JAR文件将命名为package-20031217.jar
<jar destfile="package-${DSTAMP}.jar" basedir="classes"/>
还可以配置 tstamp 任务来设置不同的属性,应用一个当前时间之前或之后的时间偏移,或以不同的方式格式化该字符串。所有这些都是使用一个嵌套的 format 元素来完成的,如下所示:
<tstamp>
<format property="OFFSET_TIME"
pattern="HH:mm:ss"
offset="10" unit="minute"/>
</tstamp>
上面的清单将OFFSET_TIME 属性设置为距离当前时间 10分钟之后的小时数、分钟数和秒数。
用于定义格式字符串的字符与 java.text.SimpleDateFormat 类所定义的那些格式字符相同。
4、使用svn的支持:
1>、ant本身需要svnant任务插件支持,才能在ant脚本中获取svn中的内容,svnant是subclipse的组件之一,它的URL 是:
http://subclipse.tigris.org/svnant.html
2>、使用前需要将它依赖的类库放在ant安装目录下面的lib目录;
3>、要想使用svnant中的任务访问svn的话,首先要定义新的task:
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpath="svnant.jar" /> <!-- 这里就要求svnant.jar在系统classpath中 -->
5、最后就是启动tomcat及停止tomcat.