WebLogicでは、事前にjspファイルをコンパイルしておくことにより、実行時のコンパイルをしないようにする事が出来る。
|
|
例として、webappsというディレクトリー内にjspファイルやWEB-INFがあるとする。
普通はwebapps配下をwarファイルにする。するとその中にjspファイルが入っており、実行時にそのjspファイルが初めて要求された際に(javaソースに変換されて)classファイルにコンパイルされ、そのクラスが実行される。
事前コンパイルする方法では、まずwlappcによりwebapps/WEB-INF/classes配下に(jspファイルをコンパイルした)classファイルを格納しておく。
warファイルを作る際にはjspファイルは不要なので、除去しておく。
そして、実行時にjspファイルが要求された場合の処理を行うサーブレット(JSPClassServlet)を登録しておく。
すると、そのサーブレットが事前コンパイル済みのクラスを読み込んで実行してくれる。
事前コンパイルしてwarファイル内からjspファイルを除去してしまうので、実行時には本来処理したいjspファイルが存在しないことになる。
この為、jspファイルが指定された場合の処理を別途定義しておく必要がある。
WebLogicでは、その為にJSPClassServletというクラスが用意されている。
拡張子が「jsp」のURLが指定されたらJSPClassServletを呼び出すようにweb.xmlを設定する。
pre_src/webapps/WEB-INF/web.xml:
<?xml version="1.0" encoding="Shift_JIS"?> <web-app> <servlet> <servlet-name>JSPClassServlet</servlet-name> <servlet-class>weblogic.servlet.JSPClassServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>JSPClassServlet</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> </web-app>
また、weblogic.xmlに「プリコンパイルパラメータ」を指定する必要があるらしい。
pre_src/webapps/WEB-INF/weblogic.xml:
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE weblogic-web-app 〜> <weblogic-web-app> <jsp-descriptor> <jsp-param> <param-name>precompile</param-name> <param-value>false</param-value> </jsp-param> <jsp-param> <param-name>pageCheckSeconds</param-name> <param-value>-1</param-value> </jsp-param> <!--WLS10.0 <jsp-param> <param-name>page-check-seconds</param-name> <param-value>-1</param-value> </jsp-param> --> </jsp-descriptor> </weblogic-web-app>
jspファイルを事前コンパイルするには、AntのWebLogic用独自タスクwlappcを使用する。
(Tomcatではjspc(jasper)を使用する)
(wlappcは、JSPだけでなくEJBのチェックもしてくれるらしい)
build.xml:
<?xml version="1.0" encoding="Shift_JIS"?> <project name="weblogic-precompile" basedir=".." default="appc"> <property name="bea.home" location="C:/bea" /> <property name="wl.home" location="${bea.home}/wlserver_10.0" /> <path id="wl.class.path"> <path path="${java.class.path}" /> <fileset dir="${wl.home}/server/lib"> <include name="*.jar" /> </fileset> </path> <taskdef name="wlappc" classname="weblogic.ant.taskdefs.j2ee.Appc" classpath="${wl.home}/server/lib/weblogic.jar" /> <target name="appc"> <wlappc source="pre_src/webapps" destdir="pre_dst/webapps" classpathref="wl.class.path" /> </target> </project>
wlappcはWebLogic独自のタスクなので、使用するには専用のライブラリが必要。[2007-07-21]
WebLogicに同梱されているantを使えば特に設定せずにタスクを使えるのかもしれないが、(Eclipse等の)その他のantではtaskdefでライブラリの場所を指定する必要がある。
sourceには、コンパイル対象のjspやEJBが入っているディレクトリを指定する。
WEB-INF/web.xmlやapplication.xmlなどが存在する、通常のウェブアプリのディレクトリ構成でないといけない。
これを実行すると、pre_src/webapps配下のjspファイルがコンパイルされてpre_dst/webapps/WEB-INF/classes/jsp_servletにclassファイルが作成される。
また、pre_src/webapps内の全ファイルもコピーされる。つまり、コンパイルの元となったjspファイルそのものもコピーされる。
このjspファイルは実行時には不要なので、warファイル作成時にはjspファイルを除外してやる。
<target name="mk_war">
<war destfile="pre_dst/pre.war" webxml="pre_dst/webapps/WEB-INF/web.xml">
<fileset dir="pre_dst/war">
<exclude name="**/web.xml" />
<exclude name="**/*.jsp" />
</fileset>
</war>
</target>
WebLogic10でも事前コンパイルして実行することは出来る。
しかし起動時に以下のようなメッセージが表示される。
<Warning> <HTTP> <BEA-101299> <servlet-name "JSPClassServlet" の servlet-mapping は *.jsp のデフォルトのマッピングをオーバーライドします。 これはコードの脆弱性につながる可能性があります。>
…メッセージの説明がWebLogic8.1のドキュメントにも書かれてるから、昔からこのメッセージは出るのか^^;
しかしWebLogic10.0のWebLogic JSP リファレンスにはJSPClassServletについての記述が無くなっているようなので、非推奨になったとか?
wljspcは、WebLogic用の、jspファイルをJavaソース(サーブレット)に変換するAntのオプションタスク。[2008-10-29]
これで、WebLogicではJSPがどんなJavaコードになっているのか確認することが出来る。
<target name="webapps_jspc"> <mkdir dir="pre_jspc" /> <wljspc src="pre_src/webapps" dest="pre_jspc" package="jsp_servlet"> <classpath refid="wl.class.path" /> </wljspc> </target>
pre_jspc配下に、jspファイルを変換したJavaソースと、それをコンパイルしたclassファイルが生成される。
(ソースを確認したいだけならclassファイルへの変換は不要なのだが、それを止めるオプションは無さげ…)
なお、wljspc自体はデフォルトのAntに入っているが、実体はweblogic.jspcらしい。