【问题标题】:How do I make the java ClassLoader aware of available classes?如何让 java ClassLoader 知道可用的类?
【发布时间】:2017-09-30 17:50:45
【问题描述】:

我正在尝试为现有应用程序创建 Java 插件。插件希望在主应用程序中重用许多已经存在的代码库(例如日志记录、错误处理等)。

我正在尝试将插件加载为 .jar 文件,如下所示:

String localPath = "...";
String pluginName = "...";

File jarFile = new File(localPath);
ClassLoader pluginLoader = URLClassLoader.newInstance(new URL[]{jarFile.toURL()});

pluginLoader.loadClass(pluginName).newInstance();

我遇到的问题是找不到我想在插件中导入的类,即使它们存在于主应用程序中,我也会收到如下错误:

NoClassDefFoundError: com/foo/exception/FooException
at com.foo.plugins.PluginManager.loadPlugin(PluginManager.java:187)
at com.foo.plugins.PluginManager.loadPlugins(PluginManager.java:86)
...

com/foo/exception/FooException 在代码中随处可见,但我不想在插件 jar 文件中包含这个类(以及许多其他类)。相反,我希望ClassLoader 以某种方式了解本地现有的类。这可能吗?如果是这样,我该怎么做?

【问题讨论】:

    标签: java plugins dependencies classloader dependency-management


    【解决方案1】:

    您需要使用主应用程序的类加载器作为父级:

    ClassLoader mainLoader = ThisClass.class.getClassLoader(); // some class in the main application
    ClassLoader pluginLoader = URLClassLoader.newInstance(new URL[]{jarFile.toURL()}, mainLoader);
    

    然后插件类加载器加载的类将可以访问主类加载器加载的类(以及那个类加载器的父类,如果有的话,等等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2022-01-17
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多