2015-10-14 101 views
1

我在寫一個Spring web應用程序,它在運行時加載插件文件。這些插件是實現IPlugin的類。但是,在運行時加載插件時,我得到一個ClassNotFoundException(無法找到IPlugin)。Spring webapp加載插件:ClassNotFoundException

接口IPlugin位於我的web應用程序的一個包中。爲了構建插件,我將接口導出到jar文件並將其包含在插件的構建路徑中。

URL fileUrl = jar.toURI().toURL(); 
String jarUrl = "jar: " + fileUrl + "!/"; 
URL[] urls = new URL[] {new URL(jarUrl)}; 
URLClassLoader loader = new URLClassLoader(urls); 
IPlugin plugin = (IPlugin) Class.forName(clazz, true, loader).newInstance(); 

我如何在運行時可用的接口:

在我的web應用程序,該插件使用URLClassLoader裝?

編輯: 如果我將包含IPlugin.class的罐子與插件一起加載,它可以工作。但那真的有必要嗎?

+0

它被添加到/ lib /文件夾或部署程序集? –

+0

我假設你使用的是tomcat,這個JAR文件是否存在於WEB-INF/lib內部? –

+0

我在我的WEB-INF/lib中添加了包含'IPlugin'的jar,但問題仍然存在。我是否還需要將插件添加到WEB-INF/lib中? – user2035039

回答

0

我找到了解決辦法,我必須設置父類加載器是這樣的:new URLClassLoader(URLs, getClass().getClassLoader())。然後,在webapp中存在IPlugin接口就足夠了,WEB-INF/lib中不需要額外的jar。

0

我不認爲你可以使用IPlugin不導入頂部

簡單地把IPlugin.java你的代碼使用相同的包名,無可厚非這

您可以直接使用全文件路徑通過的URLClassLoader

試試下面的代碼

URL[] classLoaderUrls = new URL[]{new URL("file:///<your directory path>/<your filename>.jar")}; 

URLClassLoader urlClassLoader = new URLClassLoader(classLoaderUrls); 
Class<?> beanClass = urlClassLoader.loadClass("com.my.MyImplementation"); 

Constructor<?> constructor = beanClass.getConstructor(); 
Object beanObj = constructor.newInstance(); 

嘗試強制類型轉換,如果你在你的導入有IPlugin.java加載一個JAR在上面這將工作

IPlugin plugin = (IPlugin)beanObj; 

否則,你需要使用反射

Method method = beanClass.getMethod("myMethod"); 
method.invoke(beanObj); 
+0

我在我的web應用程序中使用了相同包名的'IPlugin',但是當調用'urlClassLoader.loadClass(「...」)'' – user2035039

+0

時,我仍然得到一個'ClassNotFoundException' **你必須有** import .IPlugin **在頂部,你必須能夠編譯它 –

相關問題