[英]Spring webapp loading plugins: ClassNotFoundException
我正在編寫一個Spring Web應用程序,該應用程序在運行時加載插件文件。 這些插件是實現IPlugin
類。 但是,在運行時加載插件時,出現ClassNotFoundException
(找不到IPlugin
)。
IPlugin
界面位於我的Web應用程序的程序包中。 為了構建插件,我將接口導出到jar文件,並將其包含在插件的構建路徑中。
在我的Web應用程序中,使用URLClassLoader
加載了插件:
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();
如何在運行時使接口可用?
編輯:如果我將包含IPlugin.class
的jar和插件一起加載,它確實可以工作。 但這真的有必要嗎?
我認為如果不先導入,就無法使用IPlugin
只需使用相同的包名稱將IPlugin.java引入您的代碼,這沒什么錯
您可以直接使用完整的文件路徑通過URLClassLoader加載JAR
試試下面的代碼
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,它將起作用
IPlugin plugin = (IPlugin)beanObj;
否則,您需要使用反射
Method method = beanClass.getMethod("myMethod");
method.invoke(beanObj);
我找到了解決方案,我必須像這樣設置父類加載器: new URLClassLoader(URLs, getClass().getClassLoader())
。 這樣,在Webapp中存在IPlugin
接口就足夠了,WEB-INF / lib中不需要其他jar。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.