2015-10-14 104 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 **在顶部,你必须能够编译它 –

相关问题