読者です 読者をやめる 読者になる 読者になる

JSPWIKI

Java

exewrapにTomcat6のJasperを含ませて使うと、JSPコンパイル時にJSPAPIが無い的なエラーになったため、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の作者は、相当へこんだんじゃないかな・・・と勝手に妄想したりしてしまいました。