2014-09-12 48 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。

相關問題