Java EE应用程序自定义编译类加载器

时间:2011-12-07 18:18:51

标签: jsp servlets classloader web-applications

以下是要求:

  1. Java EE Web应用程序(在Tomcat中)......
  2. 死简单,只是JSP,servlet和jar - 没有框架......
  3. 没有什么需要重新加载,不是服务器,不是上下文,没有...
  4. 到目前为止,这个想法是扩展WebappClassLoader(catalina.jar)以创建自己的自定义类加载器,并将其作为Loader元素在context.xml中注册。使用一些代码,您可以很好地编写类加载器,谁将知道在哪里找到java源文件,然后在需要时将它们编译成类文件,然后在被要求时将它们加载到内存中。逻辑简单明了。

    除外:

      

    Jasper将如何知道自动化 - 找到由您的自定义类加载器生成的类,以便它可以编译引用它们的JSP,甚至可以动态刷新它们(您的类)?难道不可能实现吗?

    您怎么看?

    (请不要试图通过指向许多为您处理此类事情的现有框架来分散对话。要求非常具体:没有框架,没有任何内容)

1 个答案:

答案 0 :(得分:0)

可以在当前的Web应用程序上下文(context.xml)中添加一个类加载器:

<Context>
    <Loader loaderClass = "gr.nevma.cccl.CompilingClassLoader"/>
</Context>

然后创建一个类加载器:

package package gr.nevma.cccl;

import ...

public class CompilingClassLoader extends WebappClassLoader {

    public CompilingClassLoader ( ClassLoader parentClassLoader ) {

        super( parentClassLoader );

    }

    public Class<?> loadClass ( String className, boolean resolve ) throws ClassNotFoundException { 

        Class<?> theClass = null;

        // Do you stuff here
        return theClass;

    }

}

但是,只有通过调用ClassLoader :: loadClass(...)才能从类加载器本身显式加载类,这才有用。这对Jasper的JSP编译没有帮助。这意味着当Jasper尝试编译使用由此类加载器加载的类的JSP时,编译将失败,因为Jasper甚至不会要求此类加载器加载任何类。

因此,通过这种方式,可以实现类的自动加载和重新加载,但是以某种方式 - 手动方式。这些类可以在整个Web应用程序中统一使用,即JSP页面!