web項目ant打包完整案例
========================================================================================================
前兩週做的web項目要部署到服務器上去,爲了後續升級部署方便,決定採用Ant進行(開發用的myeclipse 8.5),ant打包測試也是在myeclipse上進行,build.xml測試完成後地通過本地配置的ant進行手工打包:ant -buildfile build.xml.下面將相關過程簡單總結如下:
(1)運用myeclipse對web項目打war包,觀察其他結構和組成,方便ant打包build.xml整理
圖1 web項目s2si結構
圖2 myeclipse打出war包總體結構
圖3.myeclipse打出war包WEB-INFO目錄結構
圖4.myeclipse打出war包WEB-INFO\classes目錄結構
(2)build.xml內容整理:
(3)本地安裝Ant並設置ANT_HOME和path:
(4)運用本地ant打包:
---->>打出war包查看:
--->>
(5)問題及解決歸納總結:
A1.build.xml注意設置basedir:
<project name="s2si" default="dist" basedir=".">
--->>這裏basedir="."意思是基礎目錄是與build.xml同級目錄,比如說src或 s2si,後續新建目錄都是在此基礎上進行,爲了方便打包,可以根據自己需要放置 build.xml,比如我就放在了工程s2si根目錄下.
A2.build.xml注意設置<war>命令中的basedir:
<war destfile="${build.dir}/${ant.project.name}.war" basedir="${build.dir}" webxml="${build.web.dir}/web.xml"/>
打包是將編譯好的class文件和相關配置文件集體打包,所以應該選擇 "${build.dir}",開始自己犯錯basedir="${basedir}",直接導致打出的war包下 面很亂,即使打包過程沒出錯,但部署到tomcat上就會報一大堆問題.
A3.打包時需要注意編碼和jdk版本:
<javac destdir="${build.web.class.dir}" source="1.6" target="1.6" debug="on"
deprecation="false" optimize="false" failοnerrοr="true" srcdir="${src.dir}" >
<compilerarg line="-encoding UTF-8"/>
<classpath refid="project.classpath" ></classpath>
</javac>
--->>字符編碼要和web項目編碼一致,jdk版本要和本地安裝版本一致.如果不致,myeclipse中運行build.xml打包編譯不過,本地手工ant打包會報如下錯:
eclipse 出現警告: [options] 未與 -source 1.6 一起設置引導類路徑.
A4.build.xml拷貝頁面文件和配置文件時注意excludes使用:
<copy todir="${build.web.class.dir}">
<!-- 複製源代碼目錄中所有的非java文件 -->
<fileset dir="${src.dir}" excludes="**/*.java">
</fileset>
</copy>
<copy todir="${build.dir}">
<!-- WebRoot目錄中所有的非java文件 -->
<fileset dir="${webRoot.dir}" excludes="**/*.class" >
</fileset>
</copy>
--->>說明:
${src.dir}=s2si/src
${webRoot.dir}=s2si/WebRoot
這裏需要注意的是要排除指定目錄中某些規則的文件必須用:excludes="**/*.java"或excludes="**/*.class",**/*.*這是ant裏的規則,不是指兩級目錄後的規則篩選.
--->> classpath備忘:
<classpath refid="project.classpath" ></classpath>
這裏用classpath標籤,指定路徑時用classpathref還是用path還是用refid有不同的情況,這裏用的是refid,注意根據自己情況而定.
---->> ant打包核心build.xml內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="s2si" default="dist" basedir=".">
<property name="build.dir" value="build" description="輸出目錄"/>
<property name="build.web.dir" value="${build.dir}/WEB-INF" description="web配置輸出目錄"/>
<property name="build.web.class.dir" value="${build.web.dir}/classes" description="web類輸出目錄"/>
<property name="build.web.lib.dir" value="${build.web.dir}/lib" description="web引用jar輸出目錄"/>
<property name="src.dir" value="src" description="源代碼目錄"/>
<property name="webRoot.dir" value="${basedir}/WebRoot" />
<property name="lib.dir" value="${webRoot.dir}/WEB-INF/lib" />
<property name="encoding" value="utf-8" description="文件編碼"/>
<path id="project.classpath">
<fileset dir="${lib.dir}">
<include name="*.jar" />
</fileset>
<pathelement path="${basedir}/WebRoot/WEB-INF/lib"/>
</path>
<target name="init">
<delete dir="${build.dir}"/>
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.web.dir}"/>
<mkdir dir="${build.web.lib.dir}"/>
<mkdir dir="${build.web.class.dir}"/>
</target>
<target name="compile" depends="init">
<javac destdir="${build.web.class.dir}" source="1.6" target="1.6" debug="on"
deprecation="false" optimize="false" failοnerrοr="true" srcdir="${src.dir}" >
<compilerarg line="-encoding UTF-8"/>
<classpath refid="project.classpath" ></classpath>
</javac>
<copy todir="${build.web.class.dir}">
<!-- 複製源代碼目錄中所有的非java文件 -->
<fileset dir="${src.dir}" excludes="**/*.java">
</fileset>
</copy>
<copy todir="${build.dir}">
<!-- WebRoot目錄中所有的非java文件 -->
<fileset dir="${webRoot.dir}" excludes="**/*.class" >
</fileset>
</copy>
</target>
<target name="main" depends="init,compile" />
<target name="dist" depends="main" description="將工程打成war包">
<war destfile="${build.dir}/${ant.project.name}.war" basedir="${build.dir}" webxml="${build.web.dir}/web.xml"/>
</target>
</project>
--->>關於ant基礎知識和使用指南,請參見:
http://blog.itpub.net/29119536/viewspace-1203386/
--->>web項目打包指南請參見:
http://blog.itpub.net/29119536/viewspace-1204798/