1.引言
之前有個任務就是寫個ant將項目打包成jar文件和war包的配置文件交給測試去進行部署使用,因爲項目本身是個web項目,同時還有一些相應的後臺獨立程序也一起寫在這個項目下,使用了一段時間後試着自己寫個通用的配置文件專門用戶做這種發佈打包的事情,一勞永逸
2.目錄結構
項目是個web項目,使用svn進行管理,標準的web項目目錄結構如下
root
|——confg 配置文件存放目錄
|——html webroot根目錄
|——lib 引用的jar包存放的目錄
|——src java源代碼存放目錄
我在項目下新建了個bin目錄用戶存放打包配置文件和打包命令
bin
|——build.xml 通用配置文件模版
|——build.properties 參數配置文件
|——jar.shell 打包成jar包腳本
|——war.shell 打包成war包腳本
使用這種的配置方法我們可以僅僅通過修改參數配置文件就可以不斷重複使用這個打包的配置文件了
而不用針對不同的項目反覆編寫不同的build.xml了
3.例子代碼
build.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="process">
<!-- 指定參數配置文件 -->
<property file="build.properties" />
<!-- 指定環境變量參數爲:SystemVariable -->
<property environment="SystemVariable" />
<!-- 指定是否配置主類判斷條件 -->
<condition property="mainClass.exist">
<isset property="project.mainClass" />
</condition>
<!-- 初始化任務,創建對應的文件夾 -->
<target name="init">
<!-- 刪除上次編譯產生的緩存文件 和生成的類文件-->
<delete dir="${build.classes.dir}" />
<delete dir="${build.tmp.dir}" />
<!-- 刪除上次編譯產生打包的依賴包和配置文件包-->
<delete file="${build.dist.dir}/${project.name}_config.jar" />
<delete file="${build.dist.dir}/${project.name}_lib.jar" />
<delete file="${build.dist.dir}/${project.name}.jar" />
<delete file="${build.dist.dir}/${project.name}.war" />
<!-- 創建class文件存放的路徑和緩存路徑 -->
<mkdir dir="${build.classes.dir}" />
<mkdir dir="${build.tmp.dir}/${project.name}" />
<mkdir dir="${build.tmp.dir}/${project.name}/classes" />
<mkdir dir="${build.tmp.dir}/${project.name}/config" />
<mkdir dir="${build.tmp.dir}/${project.name}/lib" />
<mkdir dir="${build.tmp.dir}/${project.name}/webroot/WEB-INF/lib" />
<mkdir dir="${build.tmp.dir}/${project.name}/webroot/WEB-INF/classes" />
</target>
<!-- 編譯任務 -->
<target name="compile" depends="init">
<echo message="開始編譯java - ${project.name}" />
<!-- 指定編譯時源碼的路徑,生成的class文件存放的目錄,以及 編譯時的相關參數-->
<javac fork="true" executable="${SystemVariable.JAVA_HOME}/bin/javac" srcdir="${build.src.dir}" destdir="${build.classes.dir}" debug="true" debuglevel="lines,vars,source" nowarn="true" includeAntRuntime="no" failonerror="true" >
<!--<compilerarg line="-encoding UTF-8 -J-Xms1024m -J-Xmx1024m"/>-->
<!-- 將編譯時需要的依賴包添加到classespath中,fileset可以多個 -->
<!-- 如果是web項目注意把對應的servlet-api.jar jsp-api.jar等相關jar包引入,要不乾脆直接將tomcat的lib目錄直接引入 -->
<classpath>
<fileset dir="${build.lib.dir}" includes="*.jar" />
</classpath>
<!-- 將源碼路徑下所有的文件全部加載進來-->
<include name="**/*.*" />
<!-- 排除掉不參與編譯的文件-->
<exclude name="test/**/*.*" />
<exclude name="**/test/*.*" />
<exclude name="example/**/*.*" />
</javac>
<echo message="編譯完成" />
<echo message="將編譯好的Class打成包" />
</target>
<target name="jar-target" depends="compile" if="mainClass.exist">
<echo message="將編譯好的Class打成包,設置${project.mainClass}爲運行的主類" />
<jar destfile="${build.dist.dir}/${project.name}.jar" encoding = "UTF-8" >
<!-- 指定main方法和依賴包以及配置文件包,配置文件包用空格分開 -->
<manifest>
<attribute name="Main-Class" value="${project.mainClass}"/>
<attribute name="Class-Path" value="${project.name}_lib.jar ${project.name}_config.jar"/>
</manifest>
<fileset dir="${build.classes.dir}">
<!-- 全部加進去吧,不止class文件,如果只加的話可以過濾*.class -->
<include name="**/*.class" />
</fileset>
</jar>
<echo message="打包完成" />
</target>
<target name="jar" depends="jar-target" unless="mainClass.exist">
<echo message="將編譯好的Class打成包,不設置主類" />
<jar destfile="${build.dist.dir}/${project.name}.jar" encoding = "UTF-8">
<manifest>
<attribute name="Class-Path" value="${project.name}_lib.jar"/>
</manifest>
<fileset dir="${build.classes.dir}">
<include name="**/*.class" />
</fileset>
</jar>
<echo message="打包完成" />
</target>
<!-- 打包相關的文件 -->
<target name="process" depends="compile">
<echo message="複製相關配置文件" />
<copy todir="${build.tmp.dir}/${project.name}/config">
<fileset dir="${build.config.dir}" includes="**/*"/>
</copy>
<echo message="複製關聯的jar包" />
<copy todir="${build.tmp.dir}/${project.name}/lib" overwrite="true">
<fileset dir="${build.lib.dir}" includes="**/*"/>
</copy>
<jar destfile="${build.dist.dir}/${project.name}_config.jar" basedir="${build.tmp.dir}/${project.name}/config"/>
<jar destfile="${build.dist.dir}/${project.name}_lib.jar" basedir="${build.tmp.dir}/${project.name}/lib"/>
</target>
<target name="war" depends="compile">
<echo message="複製文件" />
<copy todir="${build.tmp.dir}/${project.name}/webroot/WEB-INF/classes">
<fileset dir="${build.config.dir}" includes="**/*"/>
</copy>
<copy todir="${build.tmp.dir}/${project.name}/webroot" overwrite="true">
<fileset dir="${build.webroot.dir}" includes="**/*"/>
</copy>
<copy todir="${build.tmp.dir}/${project.name}/webroot/WEB-INF/lib">
<fileset dir="${build.lib.dir}" includes="*.jar" />
</copy>
<copy todir="${build.tmp.dir}/${project.name}/webroot/WEB-INF/classes">
<fileset dir="${build.classes.dir}">
<include name="**/*.class" />
</fileset>
</copy>
<echo message="複製文件完成" />
<echo message="生成war" />
<jar destfile="${build.dist.dir}/${project.name}.war" basedir="${build.tmp.dir}/${project.name}/webroot">
</jar>
<echo message="生成war完成" />
</target>
</project>
build.properties:
####################以下路徑全部都是相對於build.xml存放的位置
##相關依賴jar包的存放目錄
build.lib.dir=../lib
##相關配置文件的存放目錄
build.config.dir=../config
##java源代碼的存放目錄
build.src.dir=../src
##編譯的class文件的存放目錄
build.classes.dir=../classes
##webroot根目錄
build.webroot.dir=../html
##中間文件的緩存目錄
build.tmp.dir=tmp
##打包結果存放的目錄
build.dist.dir=dist
####################
####################
##項目名稱
project.name=test
##Main類可以不設置,那麼就是不設置Main方法的打包
project.mainClass=com.test.MainClass
####################
jar.shell:(前提,將ant配置進環境變量內可以直接調用)
ant -buildfile build.xml
運行結果圖
war.shell:(前提,將ant配置進環境變量內可以直接調用)
ant -buildfile build.xml war
運行結果圖