【问题标题】:Spring webapp loading plugins: ClassNotFoundExceptionSpring webapp加载插件:ClassNotFoundException
【发布时间】:2016-01-12 10:31:26
【问题描述】:

我正在编写一个 Spring Web 应用程序,它在运行时加载插件文件。这些插件是实现IPlugin 的类。但是,在运行时加载插件时,我得到一个ClassNotFoundException(找不到IPlugin)。

接口IPlugin 位于我的网络应用程序的一个包中。为了构建插件,我将接口导出到 jar 文件并将其包含在插件的构建路径中。

在我的网络应用中,插件是使用 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 与插件一起加载,它确实有效。但这真的有必要吗?

【问题讨论】:

  • 添加到 /lib/ 文件夹或部署程序集?
  • 我假设你使用的是tomcat,这个JAR文件是否存在于WEB-INF/lib中?
  • 我将包含 IPlugin 的 jar 添加到我的 WEB-INF/lib 中,但问题仍然存在。我还需要将插件添加到 WEB-INF/lib 吗?

标签: java spring spring-mvc web-applications


【解决方案1】:

我不认为你可以使用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();

尝试键入 cast,如果您的导入中有 IPlugin.java,这将起作用

IPlugin plugin = (IPlugin)beanObj;

否则需要使用反射

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

【讨论】:

  • 我的网络应用程序中有 IPlugin 具有相同的包名称,但在调用 urlClassLoader.loadClass("...") 时我仍然得到 ClassNotFoundException
  • 你必须有 import .IPlugin 并且你必须能够编译它
【解决方案2】:

我找到了解决方案,我必须像这样设置父类加载器:new URLClassLoader(URLs, getClass().getClassLoader())。然后在 webapp 中存在 IPlugin 接口就足够了,WEB-INF/lib 中不需要额外的 jar。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 2014-06-30
    • 1970-01-01
    • 2014-10-15
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多