Ant編譯多個依賴工程jar、war包

ant編譯war包

背景介紹:

項目由3個工程組成,3個工程分別爲businessManager(以下簡稱爲busi)工程、FrameWork(以下簡稱爲frame)工程、ppfmgr(以下簡稱爲mgr)工程,3個工程代表的含義分別爲,busi代表業務工程,即項目中所有的業務層邏輯處理都放到該工程中,frame代表工具類及項目中所有用到的第三方jar包。mgr爲web工程,即所有的前端和controller層放到該工程中,由於我是中間介入到該項目中,所以對於該項目中jar包沒有用maven管理表示很不爽。不過因禍得福,正因爲沒有maven進行管理,所以纔有了這篇ant編譯war包的文章。開發團隊比較小,所以每次測試部署都是開發人員的活,爲了把工作儘量做到自動化,想到了用jenkins工具,網上了解了一下該工具,發現和當前的需求非常吻合,即解決項目部署的自動化操作。在後來的瞭解中發現,其實jenkins能實現的功能不僅僅是自動化部署。

項目結構介紹:

  • BusinessManager工程結構
    BusinessManager工程
    該工程主要包括了業務層的代碼,即所有的service層和dao層的代碼以及mapping文件都在該工程中,最後要把該工程編譯爲jar包放到war包中,所以該層在編譯爲jar包時需要處理的包括兩部分,一部分爲將java文件編譯爲class文件,另一部分是將工程中的配置文件和編譯的class文件一起打成jar包。值得注意的是打jar包時,一定要將配置文件放進去,剛開始由於沒注意這個問題,在編譯好war包後啓動服務器時一直報錯,後來排查了好久才發現是因爲jar包中缺少了應該有的配置文件。
  • FrameWork工程結構
    FrameWork工程
    從上圖可以看到該工程主要包含了一些工具類和第三方jar包,同樣需要將該工程編譯爲jar包放到war包中,編譯該工程時比較順利,沒遇到什麼坑。
  • ppfmgr工程結構
    ppfmgr工程
    該工程爲web項目的前端,主要包括了前端展示頁面和controller層以及項目的配置文件。該工程需要編譯爲war包,同樣在將該工程編譯爲war包時第一步先編譯java文件爲class文件,之後在打成war包時需要將配置文件放到war包中。

build.xml文件介紹

該部分的介紹將分別通過3個工程進行介紹,其中Businessmanager工程最終需要編譯爲jar文件,FrameWork工程最終需要編譯爲jar文件,之後會將這兩個jar包放到FrameWork工程下的lib目錄中,方便後面打war包時引入,ppfmgr工程最終需要編譯爲war包。
- build.xml公共部分介紹:
這裏寫圖片描述
標籤property即定義了一些變量,主要都是需要文件的路徑,由於第一次寫build.xml文件,所以可能有一些細節沒有注意,寫的不是特別規範。變量很容易理解就不做介紹了。下面的path爲編譯項目時使用的公共部分,主要包含了第三方的jar包,其中lib.dir表示的是FrameWork下的lib中的jar包。而jre.dir爲jdk下的jar包位置,剛開始沒加時編譯會報錯,後來查看發現項目中用到了一個jre下的一個jar包。ant.dir爲ant編譯時需要的jar包。catalina.home爲tomcat目錄,這個不是自己添加的,原本的build.xml文件中就存在,沒有刪掉,不影響,估計應該是因爲有的項目中會用到tomcat下的jar包吧,比如servlet,一般如果項目中沒有單獨的導入,就是用的tomcat下的。
這裏寫圖片描述
截圖中的內容分別是刪除文件夾及文件和創建文件夾的,爲了保證每次編譯的內容都是最新的,還有防止因爲修改了build.xml文件的內容導致編譯時漏掉了部分文件,而原目錄中存在的現象發生。所以在每次編譯時都會先進行刪除的操作,之後在創建新的目錄。
- FrameWork工程編譯jar包介紹:
這裏寫圖片描述
該部分的內容主要是將FrameWork工程打成jar包放到FrameWork工程的lib目錄下,其中name=”compileFrameWork”表示的是編譯java文件爲class文件,name=”compileFrameJar”是將剛編譯好的class文件打成jar包。
- BusinessManager工程編譯jar包介紹:
這裏寫圖片描述
該工程打成jar包需要兩步,分別爲將java文件編譯成class文件,將編譯好的class文件和工程中原來存在的配置文件同時打到jar包中。其中name=”compileBusiManager”是用來編譯java文件的,而name=”compileBusiJar”則是用來打jar包的,在打jar包的時候會將項目中的配置文件導入進來。
- ppfmgr工程編譯及打war包介紹:
這裏寫圖片描述
同樣該工程也分兩部分進行,第一步是先將java文件編譯爲class文件,之後在將編譯好的文件打成war包,在打war包的時候也需要將項目下的配置文件導入進去。
- 整體的build.xml文件內容如下:

<?xml version="1.0" encoding="UTF-8"?>  
<project name="mgr" default="mgr" basedir="F:/jenkins">  
    <property environment="env" />  
    <property name="webapp.name" value="mgr" />  
    <property name="catalina.home" value="F:/apache-tomcat-8089" />  
    <property name="dist.dir" value="${basedir}/dist" />  
    <property name="ant.dir" value="E:/apache-ant-1.10.1" />  
    <property name="webRoot.dir" value="F:/workspace/ppfmgr/src/main/webapp"/>  
    <property name="src.dir" value="F:/workspace/ppfmgr/src" />   
    <property name="busiManager" value="F:/workspace/ppfundplus/BusinessManager/src"/>
    <property name="frameWork" value="F:/workspace/ppfundplus/Framework/src"/>
    <property name="lib.dir" value="F:/workspace/ppfundplus/Framework/lib" />  
    <property name="build.dir" value="${basedir}/build" />  
    <property name="build.dir.frame" value="${basedir}/build/frame" /> 
    <property name="build.dir.busi" value="${basedir}/build/busi" />
    <property name="jre.dir" value="D:/Program Files/Java/jre7" /> 

    <!-- 初始化classpath -->  
    <path id="project.classpath">  
        <fileset dir="${lib.dir}">  
            <include name="**/*.jar" />  
        </fileset>  
        <!-- 添加jre類路徑 -->  
        <fileset dir="${jre.dir}/lib">  
            <include name="*.jar" />  
        </fileset>  
        <!-- 添加tomcat類路徑 -->  
        <fileset dir="${catalina.home}/lib">  
            <include name="*.jar" />  
        </fileset>  
        <!-- ant lib包  -->  
        <fileset dir="${ant.dir}">  
            <include name="**/*.jar" />  
        </fileset>  
    </path>  

    <pathconvert pathsep="${line.separator}|   |-- "  
             property="echo.path.compile"  
             refid="project.classpath">  
    </pathconvert>  

    <target name="print_classpath">  
        <echo message="|-- compile classpath"/>  
        <echo message="|   |"/>  
        <echo message="|   |-- ${echo.path.compile}"/>  
    </target>  

    <!-- 刪除之前的目錄結構 -->  
    <target name="clear" description="清理舊文件">  
        <delete dir="${build.dir}" />  
        <delete dir="${build.dir.frame}" />
        <delete dir="${build.dir.busi}" />
        <delete dir="${dist.dir}" />  
        <delete file="${catalina.home}/webapps/${webapp.name}.war" />  
        <delete dir="${catalina.home}/webapps/${webapp.name}" />  
    </target>  

    <!-- 創建目錄結構 -->  
    <target name="init" depends="clear" description="創建初始化目錄結構">  
        <mkdir dir="${build.dir}/classes" /> 
        <mkdir dir="${build.dir.frame}/classes" />
        <mkdir dir="${build.dir.busi}/classes" />      
        <mkdir dir="${dist.dir}" />  
    </target>  



    <!-- 編譯java -->  
    <target name="compileBusiManager" depends="compileFrameJar" description="編譯java文件">  
        <echo message="begin compileBusiManager..." />  
        <javac srcdir="${busiManager}" destdir="${build.dir.busi}/classes"   
            includeantruntime="false" nowarn="on"   
            source="1.7" target="1.7" deprecation="true" debug="true"   
            encoding="UTF-8" classpathref="project.classpath"   
            >  
            <compilerarg line="-Xlint:unchecked" />  
        </javac>  
        <echo message="end compileBusiManager..." />  
    </target>

    <!-- 將class文件打成 jar包 -->  
    <!-- busiManager打jar包   --> 
    <target name="compileBusiJar" depends="compileBusiManager">   
        <jar jarfile="${lib.dir}/BusinessManager.jar"> 
            <fileset dir="${build.dir.busi}/classes">   
                <include name="**/*.class"/>   
            </fileset> 
            <fileset dir="${busiManager}/main/resource">   
                <include name="**/*.xml" />  
                <include name="**/*.properties" />  
                <include name="**/*.sql" />   
            </fileset>   
        </jar>   
    </target>

    <!-- 將class文件打成 jar包 -->  
    <!-- frameWork打jar包   --> 
    <target name="compileFrameJar" depends="compileFrameWork">   
        <jar jarfile="${lib.dir}/Framework.jar">   
            <fileset dir="${build.dir.frame}/classes">   
                <include name="**/*.class"/>   
            </fileset>   
        </jar>   
    </target>  

    <!-- 編譯java -->  
    <target name="compileFrameWork" depends="init" description="編譯java文件">  
        <echo message="begin compileFrameWork..." />  
        <javac srcdir="${frameWork}" destdir="${build.dir.frame}/classes"   
            includeantruntime="false" nowarn="on"   
            source="1.7" target="1.7" deprecation="true" debug="true"   
            encoding="UTF-8" classpathref="project.classpath"   
            >  
            <compilerarg line="-Xlint:unchecked" />   
        </javac>  
        <echo message="end compileFrameWork..." />  
    </target>
     <!-- 編譯java -->  
    <target name="compileMgr" depends="compileBusiJar" description="編譯java文件">  
        <echo message="begin compile..." />  
        <javac srcdir="${src.dir}" destdir="${build.dir}/classes"   
            includeantruntime="false" nowarn="on"   
            source="1.7" target="1.7" deprecation="true" debug="true"   
            encoding="UTF-8" classpathref="project.classpath"   
            >  
            <compilerarg line="-Xlint:unchecked" />  
        </javac>  
        <copy todir="${build.dir}">  
            <fileset dir="${src.dir}">  
                <include name="**/*.xml" />  
                <include name="**/*.properties" />  
                <include name="**/*.sql" />  
            </fileset>   
        </copy>  
        <echo message="end compile..." />  
    </target>

    <!-- 打成war包, 名稱默認爲 項目名 -->  
    <target name="mgr" depends="compileMgr" description="將工程打成war包">  
        <echo message="begin war..." />  
        <war destfile="${dist.dir}/${webapp.name}.war" basedir="${webRoot.dir}"   
            webxml="${webRoot.dir}/WEB-INF/web.xml">  
            <lib dir="${lib.dir}" />  
            <classes dir="${build.dir}/classes" />  
            <fileset dir="${webRoot.dir}">  
                <include name="***.*" />  
            </fileset>  
        </war>  
        <echo message="end war..." />  
    </target>  

    <!-- copy war包 tomcat的deploy目錄  
    <target name="deploy" depends="war" description="部署項目">  
        <echo message="begin deploy..." />  
        <copy file="${dist.dir}/${webapp.name}.war" todir="${catalina.home}/webapps" />  
        <echo message="end deploy..." />  
    </target>   -->

</project>  

總結:

知識的學習在於實踐,只有在用到的時候進行學習纔會體現出價值,而且在學到的同時纔會更有成就感。本來剛開始是準備搞一個jenkins自動化部署,而在使用jenkins時發現,編譯工程可以使用幾種方式,其中最簡單的方式就是使用maven進行,只需要進行簡單的配置,就可以實現。而比較麻煩一點的,就是使用ant進行編譯,ant編譯麻煩的地方主要體現在編寫build.xml文件,由於平時使用開發工具,每次編譯war包時都使用開發工具就可以實現,不用額外的編譯工具。所以在剛開始接觸ant編譯時看到build.xml文件,確實不知從何下手,慢慢的研究、學習後發現其實裏面的東西不是特別複雜,只是有些東西存在不知道怎麼用而已。學習的道路很漫長,只要不放棄,終會見到光明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章