簡體   English   中英

春季webapp加載插件:ClassNotFoundException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM