最近项目需要将java工程的打包编译进行自动化处理,而不是人工通过eclipse打war包替换之前的发布包,为此,学习了一下ant工具。
1.linux上安装ant.
从Apache Ant官网上面下载Ant软件包,http://ant.apache.org/bindownload.cgi。拷贝至linux环境下某一个目录,一般是/usr/local目录,将bin路径添加至linux的PATH中:
如果java环境已经搭建好,则可以直接运行ant命令便可,ant需要一个配置文件build.xml,默认会在当前路径寻找。
2.build.xml文件内容说明
(1)目录结构
官方文档上目录结构示例如下:
<project name="HelloWorld" basedir="." default="main">
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="main-class" value="oata.HelloWorld"/>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}"/>
</target>
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
</manifest>
</jar>
</target>
<target name="run" depends="jar">
<java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>
</target>
<target name="clean-build" depends="clean,jar"/>
<target name="main" depends="clean,run"/>
</project>
(2)使用经验
build.xml中的文档元素基本都是对应linux中的一些命令,比如<mkdir dir="/opt" />,就相当于在linux中执行一个mkdir /opt的linux命令。
准备java编译环境:
<project basedir="." default="publish" name="MC"> <!-- 指明根路径为当前路径-->
<target name="init" description="设置初始化打 war 包需要的路径变量">
<property name="name" value="MC"/>
<property name="src" value="${basedir}/MC/src"/> <!-- -java源文件的路径->
<property name="lib" value="${basedir}/MC/WebRoot/WEB-INF/lib"/> <!-- -web工程的所有lib的路径-->
<property name="webapp" value="${basedir}/MC/WebRoot"/> <!-- web工程的WebRoot路径 -->
<property name="cofig" value="${basedir}/MC/resource/"/> <!-- web工程的存放所有配置文件的目录-->
<property name="build.src" value="${basedir}/temp/MC/src"/> <!--存放java源文件的临时路径 -->
<property name="build.dest" value="${basedir}/temp/MC/WEB-INF/classes"/> <!--java文件编译后生成的class文件存放的路径 -->
<property name="buildwar.dest" value="${basedir}/temp/MC"/> <!--存放工程的总路径-->
<property name="jar.dest" value="${basedir}/temp/jar"/>
<property name="war.dest" value="${basedir}/temp/war"/> <!--存放编译后的war文件-->
<property name="j2ee.lib" value="${basedir}/j2eejar/"/> <!--存放编译java文件需要的java的jar包-->
<property name="tomcat.home" value="/opt/nmc/NMC/tomcat"/>
<!--将编译java文件所需要的所有java包都拷贝到指定目录中,后面编译java文件通过path的id引用-->
<path id="classpath">
<fileset dir="${lib}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${j2ee.lib}">
<include name="**/*.jar"/> <!--相当于把include的文件都拷贝到fileset指定的dir目录中-->
</fileset>
</path>
</target>
<!--每一个xml元素相当于一个linux命令,依次创建目录,以及进行文件夹拷贝,在linux命令行窗口中,执行ant prepare命令就可以进行编译之前的创建工作,depends配置表示此个命令需要依赖的操作-->
<target name="prepare" depends="init" description="创建打包需要的路径,拷贝源文件到打包路径下">
<mkdir dir="${build.src}"/>
<mkdir dir="${build.dest}"/>
<mkdir dir="${buildwar.dest}"/>
<mkdir dir="${jar.dest}"/>
<mkdir dir="${war.dest}"/>
<copy todir="${build.src}">
<fileset dir="${src}"/>
</copy>
<copy todir="${buildwar.dest}">
<fileset dir="${webapp}"/>
</copy>
<copy todir="${build.dest}">
<fileset dir="${cofig}"/><!--将fileset指定的dir所代表的的目录内容拷贝到todir目录中-->
</copy>
</target>
<!--开始编译java文件,在linux命令行窗口中,执行ant build命令就可以进行文件编译-->
<target name="build" depends="prepare" description="编译 java 文件,拷贝 properties 属性配置文件到编译后的路径下">
<javac srcdir="${build.src}" destdir="${build.dest}" includeantruntime="false">
<classpath refid="classpath"/>
</javac>
</target>
<!-- 开始打war包,在linux命令行窗口中,执行ant antwar命令就可以进行制作war包的操作 -->
<target name="antwar" depends="cpmapper" description="打 war 包,不将 java 文件打入包内">
<delete dir="${build.src}"/>
<war warfile="${war.dest}/MC.war" webxml="${buildwar.dest}/WEB-INF/web.xml">
<lib dir="${buildwar.dest}/WEB-INF/lib"/>
<classes dir="${build.dest}"/>
<fileset dir="${buildwar.dest}"/>
</war>
</target>
在我的项目中,由于使用mybatis配置,java的src包中,包含有很多mybatis的配置,所以需要将这些xml配置文件拷贝到相应的src目录中:
<!-- 在linux命令行窗口中,执行ant cpmapper命令就可以进行mybatis文件拷贝-->
<target name="cpmapper" depends="build" description="将mapper对应的xml文件拷入相应classes的mapper类目录">
<copy todir="${build.dest}/com/cstor/network/account/mapper">
<fileset dir="${src}/com/cstor/network/account/mapper">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.dest}/com/cstor/network/alarm/mapper">
<fileset dir="${src}/com/cstor/network/alarm/mapper">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.dest}/com/cstor/network/cloudspace/mapper">
<fileset dir="${src}/com/cstor/network/cloudspace/mapper">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.dest}/com/cstor/network/device/mapper">
<fileset dir="${src}/com/cstor/network/device/mapper">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.dest}/com/cstor/network/fault/mapper">
<fileset dir="${src}/com/cstor/network/fault/mapper">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.dest}/com/cstor/network/logger/mapper">
<fileset dir="${src}/com/cstor/network/logger/mapper">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.dest}/com/cstor/network/login/mapper">
<fileset dir="${src}/com/cstor/network/login/mapper">
<include name="*.xml"/>
</fileset>
</copy>
</target>
war完成之后,将war包发布到tomcat中:
<!--在linux命令行窗口中,执行ant publish命令就可以将war包拷贝到tomcat的webapps中-->
<target name="publish" depends="antwar,clean" description="发布 war 包至 tomcat 目录下">
<copy todir="${tomcat.home}/webapps">
<fileset dir="${war.dest}">
<include name="**/*.war"/>
</fileset>
</copy>
</target>
最后,清楚打包的临时文件,完成编译java web工程并将war包部署到tomcat中的任务:
<!--在linux命令行窗口中,执行ant clean命令就可以删除指定的目录-->
<target name="clean" depends="init" description="清除打包用临时文件">
<delete dir="${build.src}"/>
<delete>
<fileset dir="${build.dest}" includes="**/*.classes"/>
</delete>
<delete dir="${buildwar.dest}"/>
</target>
由于ant命名都在build.xml中定义,而且有依赖属性配置,执行一个ant命名,ant会自行先执行它配置的depends中的target,所以最终只要执行ant publish,就可以完成操作。
总结:
使用ant命令可以很方便的对ant命令进行编译,就相当于一个xml版本的shell语言一样,比较好用,配置简单,结合相应的shell脚本,就可以完成web工程的打包操作