exewrapにTomcat6のJasperを含ませて使うと、JSPコンパイル時にJSPのAPIが無い的なエラーになったため、Jasperのコードを漁ってみました。
たどって行くと、JasperLoaderというクラスローダーにたどり着きました。
URLClassLoaderを継承していて、JSPコンパイル用のクラスをロードするところです。
loadClassはこんな具合です。
public Class loadClass(final String name, boolean resolve) throws ClassNotFoundException { Class clazz = null; // (0) Check our previously loaded class cache clazz = findLoadedClass(name); if (clazz != null) { if (resolve) resolveClass(clazz); return (clazz); } // (.5) Permission to access this class when using a SecurityManager if (securityManager != null) { int dot = name.lastIndexOf('.'); if (dot >= 0) { try { // Do not call the security manager since by default, we grant that package. if (!"org.apache.jasper.runtime".equalsIgnoreCase(name.substring(0,dot))){ securityManager.checkPackageAccess(name.substring(0,dot)); } } catch (SecurityException se) { String error = "Security Violation, attempt to use " + "Restricted Class: " + name; se.printStackTrace(); throw new ClassNotFoundException(error); } } } if( !name.startsWith(Constants.JSP_PACKAGE_NAME) ) { // Class is not in org.apache.jsp, therefore, have our // parent load it clazz = parent.loadClass(name); if( resolve ) resolveClass(clazz); return clazz; } return findClass(name); }
最後の
if( !name.startsWith(Constants.JSP_PACKAGE_NAME) )
という所が肝で、Constants.JSP_PACKAGE_NAMEは、"org.apache.jsp"という定数になってるため、このクラスローダーではJasperのJSP系のクラスはロードしないというポリシーのようです。
で、これを手がかりにネットを見ていたら、バグレポートが出ていて、その内容が失敬ながら面白かったので紹介します。
http://mail-archives.apache.org/mod_mbox/tomcat-dev/200901.mbox/%3Cbug-46462-78@https.issues.apache.org/bugzilla/%3E
jspwikiというプロジェクトがApacheのインキュベーターにあって、どうやらそのプロジェクトが「org.apache.jspwiki」というパッケージを使っているらしく、Jasperだとコンパイル出来ないという問題のようです。
このコードを見たJSPWIKIの作者は、相当へこんだんじゃないかな・・・と勝手に妄想したりしてしまいました。