1、 在進行打包工具的制作前,需要準備的軟體有:
svnant-1.3.1
作用是讓ant和svn相關聯
apache-ant-1.9.7
需要設定ant_home,path,我的配置是:
ant_home = d:\kaipu\cms4all\app-tpl-pack\apache-ant-1.9.7
path = %ant_home%\bin
2、準備好上面的操作之後,找個英文的目錄,比如:d:\kaipu\cms4all\app-tpl-pack,在目錄下建立兩個檔案build.xml和build.properties,并把上面的svnant-1.3.1和apache-ant-1.9.7同樣放到相同目錄下,最後的目錄如下:
3、編寫build.xml檔案
<?xml version="1.0" encoding="utf-8"?>
<!--default="dist"表示當隻執行ant的時候,預設執行下面的dist指令-->
<project name="tpl-release" basedir="." default="dist">
<!--表示build.xml中引入的變量是從build.properties中獲得的-->
<property file="build.properties" />
<tstamp>
<format property="today" pattern="yyyy-mm-dd hh:mm:ss" locale="zh" />
</tstamp>
<format property="date" pattern="yyyymmdd" locale="zh" />
<!--ant要和svn相關聯,需要配置一個svnant,下面表示相關的内容依賴svnant-->
<path id="svn.classpath">
<fileset dir="${svnant.dir}/lib">
<include name="**/*.jar" />
</fileset>
</path>
<path id="depends.classpath">
<fileset dir="${java.depends.lib.dir}">
<!--引用 svnantlib.xml ,其中定義了ant的svn指令,見下方詳解。-->
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svn.classpath" />
<!--<taskdef name="yui-compressor" classname="net.noha.tools.ant.yuicompressor.tasks.yuicompressortask" classpathref="depends.classpath"></taskdef>-->
<!--通過ant clean指令能夠清除dir.source、dir.compile和dir.release這些檔案夾-->
<target name="clean">
<echo message="delete all dirs ..." />
<delete dir="${dir.source}" />
<delete dir="${dir.compile}" />
<delete dir="${dir.release}" />
</target>
<!--定義svnsetting ,新的設定svn屬性方式-->
<!-- 通過javahl模式(即設定為true),而不是svnkit模式 -->
<svnsetting id="svn.settings" svnkit="true" javahl="false" username="${svn.user}" password="${svn.pass}" />
<svnsetting id="svn.settings.1" svnkit="true" javahl="false" username="${svn.user}" password="${svn.pass}" failonerror="false" />
<!-- 導出源代碼,導出的過程中是從svn上checkout下來的,執行的指令是:ant export-source-->
<target name="export-source">
<echo message="export source" />
<mkdir dir="${dir.source}" />
<svn refid="svn.settings">
<export srcurl="${trunk.url}/${proj.app-tpl-api}" destpath="${dir.source}/${proj.app-tpl-api}" revision="head" />
<export srcurl="${trunk.url}/${proj.app-tpl-impl}" destpath="${dir.source}/${proj.app-tpl-impl}" revision="head"/>
<export srcurl="${trunk.url}/${proj.app-tpl-webapp}" destpath="${dir.source}/${proj.app-tpl-webapp}" revision="head"/>
</svn>
<!--從tag版本建立tag,在svn上打上标記-->
<target name="create-tag-from-trunk">
<svn refid="svn.settings.1">
<delete url="${tags.url}/${tag.version.label}" message="tags duplicate!" />
<echo message="create tags ${tag.version.label}" />
<mkdir url="${tags.url}/${tag.version.label}" message="tag created by tuzq on ${today}" />
<copy srcurl="${trunk.url}/${proj.app-tpl-api}" desturl="${tags.url}/${tag.version.label}" message="tag created by toto on ${today}" />
<copy srcurl="${trunk.url}/${proj.app-tpl-impl}" desturl="${tags.url}/${tag.version.label}" message="tag created by toto on ${today}" />
<copy srcurl="${trunk.url}/${proj.app-tpl-webapp}" desturl="${tags.url}/${tag.version.label}" message="tag created by toto on ${today}" />
<!--編譯api代碼-->
<target name="compile-app-tpl-api">
<echo message="compile app-tpl-api project" />
<!--javac,編譯,對應java中的javac指令,其中srcdir定義源檔案路徑 destdir定義編譯檔案路徑
includeantruntime作用是指定編譯任務是否包含ant的classpath,可有可無,不影響編譯,但不寫可能會出現警告,為了眼不見心不煩,加上吧
-->
<delete dir="${dir.compile}/${proj.app-tpl-api}"/>
<mkdir dir="${dir.compile}/${proj.app-tpl-api}"/>
<javac srcdir="${dir.source}/${proj.app-tpl-api}${java.source.path}" destdir="${dir.compile}/${proj.app-tpl-api}" debug="${option.compile.debug}" optimize="${option.compile.optimize}" deprecation="${option.compile.deprecation}" encoding="${option.compile.encoding}" target="${option.compile.target}" verbose="${option.compile.verbose}" includeantruntime="false">
<classpath>
<!--依賴的lib包下的jar檔案-->
<fileset dir="${java.depends.lib.dir}">
<include name="**/*.jar" />
</fileset>
<!--依賴的tomcat中的jar檔案-->
<fileset dir="${tomcat.lib.dir}">
</classpath>
</javac>
<!--通過ant指令進行打包,打成的包是:app-tpl-api-1.0-snapshot.jar-->
<target name="app-tpl-api-jar" description="make jar file">
<delete dir="${dir.compile}/${proj.app-tpl-api}/${tpl.jar.app-tpl-api}"/>
<property name="app-tpl-api-jar-filename" value="${dir.compile}/${proj.app-tpl-api}/${tpl.jar.app-tpl-api}" />
<jar jarfile="${app-tpl-api-jar-filename}" basedir="${dir.compile}/${proj.app-tpl-api}">
<!--為jar包指定manifest,如果jar包不需要打成runnable的形式,manifest可以不要-->
</jar>
<!--編譯app-tpl-impl.jar檔案-->
<target name="compile-app-tpl-impl">
<delete dir="${dir.compile}/${proj.app-tpl-impl}"/>
<copy file="${dir.compile}/${proj.app-tpl-api}/${tpl.jar.app-tpl-api}" todir="${java.depends.lib.dir}"/>
<mkdir dir="${dir.compile}/${proj.app-tpl-impl}"/>
<copydir dest="${dir.compile}/${proj.app-tpl-impl}" src="${dir.source}/${proj.app-tpl-impl}${proj.app-tpl-impl-mapper}">
<include name="sqlmaps/**" />
</copydir>
<javac srcdir="${dir.source}/${proj.app-tpl-impl}${java.source.path}" destdir="${dir.compile}/${proj.app-tpl-impl}" debug="${option.compile.debug}" optimize="${option.compile.optimize}" deprecation="${option.compile.deprecation}" encoding="${option.compile.encoding}" target="${option.compile.target}" verbose="${option.compile.verbose}" includeantruntime="false">
<!--打包指令,打成的包是:app-tpl-impl-1.0-snapshot.jar-->
<target name="app-tpl-impl-jar" description="make jar file">
<delete dir="${dir.compile}/${proj.app-tpl-impl}/${tpl.jar.app-tpl-impl}"/>
<property name="app-tpl-impl-jar-filename" value="${dir.compile}/${proj.app-tpl-impl}/${tpl.jar.app-tpl-impl}" />
<jar jarfile="${app-tpl-impl-jar-filename}" basedir="${dir.compile}/${proj.app-tpl-impl}">
<!-- 需要參數proj.name,主要是編譯web工程 -->
<target name="compile-app-tpl-webapp">
<echo message="compile web project ${tpl.war.app-tpl-webapp}" />
<property name="targetpath" value="${dir.compile}/${proj.app-tpl-webapp}" />
<property name="sourcepath" value="${dir.source}/${proj.app-tpl-webapp}" />
<!-- 編譯swf web工程 -->
<mkdir dir="${targetpath}" />
<mkdir dir="${targetpath}web-inf/classes" />
<copy file="${dir.compile}/${proj.app-tpl-impl}/${tpl.jar.app-tpl-impl}" todir="${java.depends.lib.dir}"/>
<copy todir="${targetpath}" overwrite="true" preservelastmodified="true">
<fileset dir="${sourcepath}${web.source.path}" />
</copy>
<javac srcdir="${sourcepath}${java.source.path}" destdir="${targetpath}web-inf/classes"
debug="${option.compile.debug}" optimize="${option.compile.optimize}" deprecation="${option.compile.deprecation}"
encoding="${option.compile.encoding}"
target="${option.compile.target}" verbose="${option.compile.verbose}" includeantruntime="false">
<copy todir="${targetpath}web-inf/classes" overwrite="true" preservelastmodified="true">
<fileset dir="${sourcepath}${config.source.path}" />
<copy todir="${targetpath}web-inf/lib" overwrite="true" preservelastmodified="true">
<fileset dir="${java.depends.lib.dir}" />
<!-- 需要war的名稱 war.name -->
<target name="war.app-tpl-webapp">
<delete dir="${dir.compile}/${tpl.war.app-tpl-webapp}"/>
<war warfile="${dir.compile}/${tpl.war.app-tpl-webapp}" webxml="${dir.compile}/${proj.app-tpl-webapp}/web-inf/web.xml">
<fileset dir="${dir.compile}/${proj.app-tpl-webapp}"/>
</war>
<!-- 釋出相關工程及依賴工具包,通過ant dist指令,可以一次性執行清除、checkout源碼、打tag、編譯、打jar、打war包等操作 -->
<target name="dist" depends="clean,export-source,create-tag-from-trunk,compile-app-tpl-api,app-tpl-api-jar,compile-app-tpl-impl,app-tpl-impl-jar,compile-app-tpl-webapp,war.app-tpl-webapp">
<!--<target name="dist" depends="compile-app-tpl-api,app-tpl-api-jar,compile-app-tpl-impl,app-tpl-impl-jar,compile-app-tpl-webapp,war.app-tpl-webapp">-->
<!-- <target name="dist" depends="create-tag-from-trunk">-->
<!-- target name="dist" -->
<!-- 編譯 -->
<!-- compile-web-proj proj.swf,proj.jod,proj.imagemagick-->
<!--将需要relase的東西copy到dist目錄下-->
<target name="copy-to-dist">
<mkdir dir="${dir.release}/${app-tpl.name}" />
<copy todir="${dir.release}/${app-tpl.name}" overwrite="true" preservelastmodified="true" includeemptydirs="false">
<!-- copy war檔案 -->
<fileset file="${dir.compile}/${tpl.war.app-tpl-webapp}" />
<!--将所有的dist裡面的東西放到svn上的release包中-->
<target name="commit-release">
<!-- 送出到release庫中 -->
<echo message="commit to release repository."/>
<delete url="${release.url}/${tag.version.label}" message="release duplicate!"/>
<mkdir url="${release.url}${tag.version.label}" message="release created by tuzq on ${today}" />
<import url="${release.url}${tag.version.label}" path="${dir.release}" message="release created by tuzq on ${today}" />
</project>
4、編寫build.properties檔案
#svn的相關屬性
svn.user=這裡填寫svn的使用者名
svn.pass=這裡填寫svn的使用者名和密碼
svnant.dir=d:/kaipu/cms4all/app-tpl-pack/svnant-1.3.1
#打tag時的版本資訊
tag.version.label=app-tpl-v1.0.0
branch.version.label=app-tpl-v1.0.0
java.depends.lib.dir=./lib
#java.compile.lib.dir=d:/app/alfresco/tomcat-7.0.32/webapps/alfresco/web-inf/lib
tomcat.lib.dir=./tomcatlib
#svn伺服器上的相關代碼位置
trunk.url=這裡放svn上trunk版本的url位址
tags.url=這裡放svn上tag版本的url位址
branches.url=這裡放branches版本的url位址
release.url=這裡放置release版本的url位址
#相關工程的資訊
proj.app-tpl-api=app-tpl-api/
proj.app-tpl-impl=app-tpl-impl/
proj.app-tpl-impl-mapper=src/main/resources
proj.app-tpl-webapp=app-tpl-webapp/
tpl.jar.app-tpl-api=app-tpl-api-1.0-snapshot.jar
tpl.jar.app-tpl-impl=app-tpl-impl-1.0-snapshot.jar
tpl.war.app-tpl-webapp=app-tpl-webapp.war
#本地編譯及釋出的目錄結構
dir.source=./source
java.source.path=src/main/java
web.source.path=src/main/webapp
config.source.path=src/main/resources
#java的編譯選項
option.compile.encoding=utf-8
option.compile.deprecation=on
#将這個打開的時候,才認springmvc中的注解
option.compile.debug=true
option.compile.optimize=on
option.compile.target=1.7
#通過下面的方式實作列印資訊
option.compile.verbose=true
dir.compile=./build
#目錄結構
#---------------------------------------------------------------
dir.release=./dist
app-tpl.name=app-tpl