使用上面的方法會改寫web.xml,並在原本的webapp中產生一些java及class檔,如果不喜歡這種方式,可以採用原本Tomcat對JSP檔的處理方式,將產生的.java檔及.class檔放在Tomcat的work目錄下。
一樣使用ant task方式來處理,步驟如下:
0.安裝ant,並設定ANT_HOME並將$ANT_HOME/bin加到$PATH去
1.將要預先編譯的webapp上傳到webapps目錄下,包含WEB-INF/web.xml檔,WEB-INF/lib目錄下的jar檔,及WEB-INF/classes目錄下的一些class檔,或者包成war檔由Tomcat自動解開。
2.將底下的ant task檔存檔為precompile.xml,放到隨便一個目錄下。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- ********************************************************************* -->
<!-- Ant build script for JSP Precompilation in Tomcat -->
<!-- Version: $Id: precompile.xml,v 1.00 2008/02/28 18:40:00 andowson Exp $ -->
<!-- ********************************************************************* -->
<project name="Webapp Precompilation" default="all" basedir=".">
<property name="tomcat.home" location="${tomcat.home}"/>
<property name="tomcat.base" location="${tomcat.base}"/>
<property name="webapp.hostname" value="${webapp.hostname}" />
<property name="webapp.name" value="${webapp.name}" />
<property name="webapp.path" location="${tomcat.base}/webapps/${webapp.hostname}/${webapp.name}"/>
<property name="dir-path" location="${tomcat.base}/work/Catalina/${webapp.hostname}/${webapp.name}"/>
<target name="jspc">
<taskdef classname="org.apache.jasper.JspC" name="jasper2" >
<classpath id="jspc.classpath">
<pathelement location="${java.home}/../lib/tools.jar"/>
<fileset dir="${tomcat.home}/server/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
<jasper2
validateXml="false"
uriroot="${webapp.path}"
webXmlFragment="${webapp.path}/WEB-INF/generated_web.xml"
outputDir="${webapp.path}/WEB-INF/src" />
<move todir="${dir-path}">
<fileset dir="${webapp.path}/WEB-INF/src">
<include name="**/*.*"/>
</fileset>
</move>
<delete dir="${webapp.path}/WEB-INF/src" failonerror="false"/>
</target>
<target name="compile">
<echo>Compile JSP in: ${dir-path}</echo>
<javac destdir="${dir-path}"
optimize="off"
debug="on"
failonerror="false"
srcdir="${dir-path}">
<classpath>
<pathelement location="${webapp.path}/WEB-INF/classes"/>
<fileset dir="${webapp.path}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/common/classes"/>
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/shared/classes"/>
<fileset dir="${tomcat.home}/shared/lib">
<include name="*.jar"/>
</fileset>
</classpath>
<include name="**/*.java" />
</javac>
</target>
<target name="all" depends="jspc,compile">
</target>
</project>
3.執行ant,例如我的Tomcat安裝在/var/tomcat5目錄下,Tomcat worker目錄(即單部主機跑多重Tomcat時的TOMCAT_BASE)是/var/robust/worker1,網站名稱是www.andowson.com,webapp名稱是examples,則輸入以下:
ant -Dtomcat.home=/var/tomcat5 -Dtomcat.base=/var/robust/worker1 -Dwebapp.hostname=www.andowson.com -Dwebapp.name=examples -buildfile precompile.xml
執行完時會有下列變化:
(1)在WEB-INF目錄下產生generated_web.xml,裡面就是一些<servlet>和<servlet-mapping>的設定。
(2)在/var/robust/worker1/work/Catalina/www.andowson.com/examples目錄下建立org/apache/jsp目錄,並將產生的java原始檔存放於該目錄下。
(3)將編譯過的class檔放在/var/robust/worker1/work/Catalina/www.andowson.com/examples/org/apache/jsp目錄下。
4.由於我們直接替Tomcat產生.java和.class檔,故不必重新reload webapp。
5.此時存取原本的jsp網頁可以發現在Tomcat的work目錄下不會再產生org/apache/jsp目錄及.java檔和.class檔。
參考資料:
http://people.apache.org/~fhanik/tomcat-precompile-jsp.xml