2014-09-12 46 views
2

我有一个在Tomcat 7中实现的插件系统,它可以动态加载这些插件的类(可通过自定义类加载器加载)。不幸的是,如果一个插件有一个使用属于这个插件的类的JSP,它就找不到这个类。这似乎是正确的行为,因为我们拥有Tomcat类加载器层次结构,并且我的自定义类加载器位于底部。如何在servlet中设置或访问Tomcat中的JspCompilationContext?

然而,本哈克的事情我可以做的类提供给JSP页面:

 URLClassLoader webappClassloader = (URLClassLoader)Thread.currentThread().getContextClassLoader(); 
     Method addURLMethod = webappClassloader.getClass().getDeclaredMethod("addURL", URL.class); 
     addURLMethod.setAccessible(true); 
     for(String url : pluginFolders) 
      addURLMethod.invoke(webappClassloader, new URL("file://" + url)); 

请注意,该插件是不是在WEB-INF/classes目录下。

这一切都很棒,但现在一个类只能加载一次(另请参阅this)。为了使插件可更新(无需重新启动整个webapp),我正在使用自定义类加载器。但是我无法设置Jasper使用的类加载器(我试过Thread.currentThread().setContextClassLoader(),它没有效果)。我深入Jasper的源头,似乎应该可以设置自定义类加载器。但我不知道如何从一个servlet实现这一点。

也许你可以给我一个答案,以下问题之一?

  • 是否有可能获得例如一个servlet中的JspCompilationContext?
  • 我读过一些关于自定义JSPServlet的内容。这将如何完成?
  • 你对如何设置类加载器有更好的了解吗?

在此先感谢!

+0

你有没有尝试过为'''设置你自己的ClassLoader?如果不是,你是如何试图让你的'ClassLoader'进入Web应用程序的类加载层次结构的? – 2014-09-17 21:09:48

+0

你太棒了!你指出我是正确的。我不知道有这样的事情。您能否将您的小费写成答案,以便我可以将其标记为已解决? – user2084865 2014-09-18 22:17:41

回答

2

您需要使用META-INF/context.xml中的<Context>来设置您自己的ClassLoader。这将允许您指定将用于您的Web应用程序的ClassLoader。

相关问题