有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpringWebApp加载插件:ClassNotFoundException

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

接口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与插件一起加载,它确实可以工作。但这真的有必要吗


共 (2) 个答案

  1. # 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();
    

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

    IPlugin plugin = (IPlugin)beanObj;
    

    否则,您需要使用反射

    Method method = beanClass.getMethod("myMethod");
    method.invoke(beanObj);
    
  2. # 2 楼答案

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