动态添加Jar插件,但发出NoClassDefFoundError

时间:2016-05-10 13:51:07

标签: java dynamic plugins classloader

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

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

这是我的实施:

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

所有插件都将放在工作目录(/plugins)的System.getProperty("user.dir") + "\\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

1 个答案:

答案 0 :(得分:0)

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

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