【问题标题】:Adding Jar Plugins Dynamically, but issuing NoClassDefFoundError动态添加 Jar 插件,但发出 NoClassDefFoundError
【发布时间】:2016-05-10 13:51:06
【问题描述】:

我最近制作了一个PluginClassLoader 来动态地将java 插件加载到我的程序中。这样插件就可以和我的程序交互了。

但是,事情不会顺利进行。所以我查阅了 bukkit 加载插件的实现。 [Bukkit's source code] 我跟着它,Java 仍然给我一个 NoClassDefFoundError

这是我的实现:

所有要添加的插件都扩展为com.mob41.sakura.plugin.Plugin。这个抽象类包含onCallPlugin()onEndPlugin()等函数,供主程序与之交互。 [Abstract class source code]

所有插件都将放置在工作目录 (System.getProperty("user.dir") + "\\plugins") 上的 /plugins 文件夹中。我的程序将在工作目录中找到文件夹 (/plugins)。如果它不存在,它会创建一个新文件夹。如果存在,它将找到所有jar 文件。并创建一个PluginClassLoader[Source Code] 来添加插件。

我预计插件将被添加到我的程序中,并且类加载器将创建它们的实例。通过这段测试代码:

public static void main(String[] args) {
    System.out.println("Loading...");
    try {
        PluginManager.getPluginManager().loadAllPlugins();
    } catch (Exception e){
        e.printStackTrace();
        return;
    }
    System.out.println("Loaded.");
    JSONObject json = new JSONObject();
    json.put("ext", false);
    System.out.println((JSONObject) PluginManager.getPluginManager().runPluginLifeCycle("Sakura-Plugin-HKOWeather", json));
    }

如果插件在加载时无效/导致错误,则会抛出此exception。 不知道为什么我的程序找不到扩展自己的插件...

com.mob41.sakura.plugin.exception.InvalidPluginException: java.lang.NoClassDefFoundError: com/mob41/sakura/plugin/Plugin
    at com.mob41.sakura.plugin.PluginManager.loadPlugin(PluginManager.java:180)
    at com.mob41.sakura.plugin.PluginManager.loadAllPlugins(PluginManager.java:145)
    at com.mob41.sakura.Main.main(Main.java:12)
Caused by: java.lang.NoClassDefFoundError: com/mob41/sakura/plugin/Plugin
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at com.mob41.sakura.plugin.PluginClassLoader.<init>(PluginClassLoader.java:25)
    at com.mob41.sakura.plugin.PluginManager.loadPlugin(PluginManager.java:176)
    ... 2 more
Caused by: java.lang.ClassNotFoundException: com.mob41.sakura.plugin.Plugin
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 17 more

【问题讨论】:

    标签: java dynamic plugins classloader


    【解决方案1】:

    经过几个小时的调试,我终于找到了答案。

    我在 PluginClassLoader 的实现中指定了错误的 ClassLoader

    【讨论】:

      猜你喜欢
      • 2012-05-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 2015-10-17
      • 2012-11-21
      • 2015-08-17
      相关资源
      最近更新 更多