最近花了点时间学习使用ant这个工具,虽然平时经常用ant脚本来构建war包,不过都是别人写好的,所以感觉自己还是有必要简单学习一下这个工具的。下面这个ant脚本是我自己写来用来打包最近在做的一个项目。过程中遇到一些问题,在此记录一下。
<?xml version="1.0" encoding="GB2312" ?>
<project name="cdaOtherService" default="Build" basedir=".">
<!-- 设置属性,方便下面使用 -->
<property name="lib.dir" location="WebContent/WEB-INF/lib" />
<property name="src" value="src"/>
<property name="resources" value="resources"/>
<property name="build.allclass" value="ant/allclass"/>
<property name="build.lib" value="ant/jar"/>
<property name="build.webapp" value="ant/webapp"/>
<property name="build.jar" value="ant/jar/test.jar"/>
<!-- 指定项目依赖的第三方jar包-->
<path id="classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
</fileset>
</path>
<!-- 创建编译过程中存放jar包及class文件的目录 -->
<target name="create-path">
<mkdir dir="${build.allclass}"/>
<mkdir dir="${build.lib}"/>
<mkdir dir="${build.webapp}"/>
<mkdir dir="${build.webapp}/WEB-INF/classes" />
</target>
<!-- 编译 -->
<!-- fork="true" executable="E:\jdk\jdk\bin\javac" 指定使用哪个jdk版本编译 也可以用target="1.7"来指定jdk版本,只是这个方法没有前面一个灵活-->
<target name="create-class">
<javac destdir="${build.allclass}" includeantruntime="on" fork="true" executable="E:\jdk\jdk\bin\javac">
<src path="${src}" />
<src path="${resources}" />
<compilerarg value="-Xlint:unchecked"/>
<compilerarg value="-Xlint:deprecation"/>
<compilerarg line="-encoding UTF-8 "/>
<classpath refid="classpath" />
</javac>
<!-- 把WebContent下的所有文件(除了.svn,**/**.svn文件)复制到ant/webapp -->
<copy todir="${build.webapp}">
<fileset dir="WebContent" includes="**" excludes=".svn,**/**.svn">
</fileset>
</copy>
<!-- 把resources下的所有文件(除了.svn,**/**.svn文件)复制到ant/allclass -->
<copy todir="${build.allclass}">
<fileset dir="resources" includes="**" excludes=".svn,**/**.svn">
</fileset>
</copy>
<!-- 把allclass下的所有文件复制到ant/webapp/WEB-INF/classes下 -->
<copy todir="${build.webapp}/WEB-INF/classes">
<fileset dir="${build.allclass}"/>
</copy>
</target>
<!-- 把allclass下的所有文件打包成jar包 -->
<target name="create-jar">
<jar destfile="${build.jar}" basedir="${build.allclass}">
<manifest>
<attribute name="Main-Class" value="test"/>
</manifest>
</jar>
</target>
<!-- 把ant/webapp下的所有文件打包成cdaOtherService.war包 -->
<target name="makeWar" depends="create-path,create-class,create-jar">
<war warfile="ant/cdaOtherService.war">
<fileset dir="${build.webapp}" />
</war>
</target>
<!-- 删除生成的class文件 -->
<target name="clean" depends="makeWar">
<delete dir="${build.allclass}"/>
<delete dir="${build.webapp}"/>
</target>
<target name="Build" depends="makeWar,clean">
<echo message="Ant is building the project.create ok" />
</target>
</project>
进入到项目根目录后:输入ant回车
控制台报找不到servlet-api.jar这个包里面的类,所以需要去tomcat目录的lib路径下找到这个包,并把它拷贝到项目里WebContent/WEB-INF/lib路径下。由于这个项目不是maven项目,而是一个普通的web项目。目录结构如下
找到servlet-api.jar这个包
放到下面的lib路径下
最后经过编译、打包成war包。
在学习的过程中碰到了字符编码异常的问题,可以通过使用
<compilerarg line="-encoding UTF-8 "/>
解决。
如果用高版本jdk编译会导致生成的war包无法在低jdk版本下运行。有两种方法解决这个问题。
一、
<javac destdir="${build.allclass}" includeantruntime="on" target="1.7">
<src path="${src}" />
<src path="${resources}" />
<compilerarg value="-Xlint:unchecked"/>
<compilerarg value="-Xlint:deprecation"/>
<compilerarg line="-encoding UTF-8 "/>
<classpath refid="classpath" />
</javac>
二、
<javac destdir="${build.allclass}" includeantruntime="on" fork="true" executable="E:\jdk\jdk\bin\javac">
<src path="${src}" />
<src path="${resources}" />
<compilerarg value="-Xlint:unchecked"/>
<compilerarg value="-Xlint:deprecation"/>
<compilerarg line="-encoding UTF-8 "/>
<classpath refid="classpath" />
</javac>
在这里推荐使用第二种方式,这个更灵活。