Webアプリケーションに含まれる JSPファイルは、通常 Webブラウザからアクセスがあった時にコンパイルされます。しかし、今後 JSPファイルの変更予定が無い場合などに事前にコンパイルしておく事ができます。このような場合にここで説明する jspc を利用してください。
基本的には以下の手順で作業を行ってください。
JSPファイルを指定してコンパイルする場合、次のように指定します。jspc は WebOTX インストールディレクトリの bin 配下にあります。以下の説明ではカレントが WebOTX インストールディレクトリにあるものとして説明します。
> bin\jspc.bat -d c:\out -uriroot c:\jsp sample01.jsp
$ bin/jspc -d /tmp/out -uriroot /tmp/jsp sample01.jsp
> bin\jspc.bat -uriroot c:\jsp sample01.jsp
$ bin/jspc -uriroot /tmp/jsp sample01.jspWindows では以下に出力されます。
C:\Documents and Settings\<User-name>\Local Settings\Temp\ の配下に org\apache\jsp\... が作られる
また、複数の JSPファイルを指定する場合は半角スペースで区切って並べます。
> bin\jspc.bat -d c:\out -uriroot c:\jsp sample01.jsp sample02.jsp
$ bin/jspc -d /tmp/out -uriroot /tmp/jsp sample01.jsp sample02.jsp
あるディレクトリ配下の複数の JSPファイルをまとめてコンパイルする場合、次のように指定します。
> bin\jspc.bat -webapp c:\jsp -d c:\out
$ bin/jspc -webapp /tmp/jsp -d /tmp/out
この指定で c:\jsp 配下にある JSPファイルを再帰的に検索してコンパイルされます。
また、-webapp の代わりに -uriroot を指定してもかまいません。
> bin\jspc.bat -uriroot c:\jsp -d c:\out
$ bin/jspc -uriroot /tmp/jsp -d /tmp/out
JSPファイル内で以下のようにタグライブラリを参照している場合、
<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
-webapp で指定するディレクトリ配下にタグライブラリディスクリプタが必要になります。
WEB-INF/jsp2/jsp2-example-taglib.tldさらにタグライブラリの実装クラスも -webapp で指定したディレクトリ配下の以下に置く必要があります。
WEB-INF/classes、WEB-INF/lib のどちらか。タグライブラリ実装クラスは -classpath オプションでそのパスを指定する事でも代用可能です。
-webinc オプションを指定すると、指定したファイルにサーブレットマッピングを出力します。
> bin\jspc.bat -webapp c:\jsp -d c:\out -c myclass -webinc c:\out\myclss.xml
$ bin/jspc -webapp /tmp/jsp -d /tmp/out -c myclass -webinc /tmp/out/myclss.xml
パスを省略するとカレントディレクトリに作成します。
また、-webinc の代わりに -webxml オプションを指定すると、サーブレットマッピングに加えて XML宣言なども含めた配備記述子を出力します。-webinc と比べて追加されるのは次の要素です。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <!-- Automatically created by Apache Jakarta Tomcat JspC. --> <web-app> (省略) </web-app>
例えば、開発環境では Java SE 6 を使わないといけないが運用環境では Java SE 7 を利用する事が分かっていれば、-source 6(もしくは 1.6), -target 7(もしくは 1.7) と指定します。
jspc で指定できるバージョンは以下の通りです。
なお、生成したクラスファイルがどのバージョン用なのかは JDK に付属の javap コマンドを使って確認する事ができます。「javap -v <クラスファイル名>(.classは除く)」を実行すると出力される内容の中で major version が "48" であれば J2SE1.4用、"49" であれば J2SE 5.0用、"50" であれば Java SE 6用、"51" であれば Java SE 7用となります。
public final class org.apache.jsp.XXXX SourceFile: "XXXX.java" minor version: 0 major version: 49 Constant pool:
コンパイルした Javaソースの 2byte 文字が文字化けする場合、以下の点が重要になります。
の2つです。それぞれ JSPファイルでは以下のように指定します。
jspc は、(a) で指定した文字エンコーディングで JSPファイルを読み込み、(b) で指定した文字エンコーディングで以下を出力します((a) が省略された場合、(b) で指定された文字エンコーディングで JSPファイルを読み込みます)。
response.setContentType("text/html; charset=Shift_JIS");
もし、既存の JSPファイルに変更を加えず文字エンコーディングを指定したい場合、-priorityJspInEncoding と -priorityJspOutEncodingEnabled を使うことで JSPファイルに指定した文字エンコーディングに関わらず強制的に指定した文字エンコーディングを使うことができます。
なお、JSPファイルに文字エンコーディングを指定していない時に特定の文字エンコーディングを指定したい場合は -defaultEncoding を指定します。これは上記 (b) 部分に適用されます。
-compile オプションを指定する事で Javaクラスまで作成する事も可能です。標準では特に何も指定しなくても WebOTX が動作するのと同じ Java のコンパイラによりコンパイルされます。
標準では WebOTX Webコンテナが持つ org.apache.jasper.compiler.AntCompiler という JSPコンパイラが使用されますが、もし、Eclipse のJDT(Java Development Tools) を使ってコンパイルしたい場合は次のようにします。
JDT(Java Development Tools) ではコンパイルにクラス(org/exlipse/jdt/compiler/xx)を利用しているため、このクラスが含まれる JAR を jspc のバッチファイル(もしくはシェルスクリプト)で指定する必要があります。
例えば、Eclipse 3.2.0 では次の JAR を指定することでコンパイルできます。
eclipse\plugins\org.eclipse.jdt.core_3.2.0.v_671.jar
これを japc.bat(or jspc)の -cp のパラメータとして指定します。
"%AS_JAVA%\bin\java" ... -cp "%AS_INSTALL%\lib\javaee.jar;...;%AS_INSTALL%\lib;org.eclipse.jdt.core_3.2.0.v_671.jar" org.apache.jasper.JspC -schemas "/schemas/" -dtds "/dtds/" %*
jspc 実行時に特定のシステムプロパティを指定したい場合は -systemprop オプションを指定します。
書式は以下のようになっており、カンマ(,)区切りで複数指定することも可能です。
-systemprop <name>=<value>[,<name>=<value>]