2

我正在嘗試爲現有應用程序創建Java插件。插件希望在主應用程序中重新使用很多已經存在的代碼庫(例如日誌記錄,錯誤處理等)。如何讓java ClassLoader知道可用的類?

我試圖加載的插件,.jar文件是這樣的:

String localPath = "..."; 
String pluginName = "..."; 

File jarFile = new File(localPath); 
ClassLoader pluginLoader = URLClassLoader.newInstance(new URL[]{jarFile.toURL()}); 

pluginLoader.loadClass(pluginName).newInstance(); 

我遇到的問題是,類我想插件裏面導入無法找到,即使它們在存在主要的應用程序,我得到象這樣的錯誤:

NoClassDefFoundError: com/foo/exception/FooException 
at com.foo.plugins.PluginManager.loadPlugin(PluginManager.java:187) 
at com.foo.plugins.PluginManager.loadPlugins(PluginManager.java:86) 
... 

com/foo/exception/FooException在代碼中到處使用,但我不希望有包括在插件jar文件這個類(和許多許多其他)。相反,我想ClassLoader以某種方式意識到本地存在的類。這可能嗎?如果是這樣,我該怎麼做?

回答

2

您需要使用您的主應用程序的類加載器作爲父:

ClassLoader mainLoader = ThisClass.class.getClassLoader(); // some class in the main application 
ClassLoader pluginLoader = URLClassLoader.newInstance(new URL[]{jarFile.toURL()}, mainLoader); 

然後通過該插件類加載器加載將有機會獲得由主類加載器加載類的類(以及類加載器的父,如果它有一個,等等)。