java—动态添加jar插件,但发出noclassdeffounderror

eqqqjvef  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(407)

我最近做了一个 PluginClassLoader 将java插件动态加载到我的程序中。这样插件就可以和我的程序交互了。
然而,事情不会很顺利。所以我查阅了bukkit的加载插件的实现[bukkit的源代码]我遵循它,java仍然给我一个 NoClassDefFoundError .
以下是我的实现:
所有要添加的插件都扩展到 com.mob41.sakura.plugin.Plugin . 这个抽象类包含 onCallPlugin() , onEndPlugin() 等函数,以便主程序与之交互[抽象类源代码]
所有的插件都将放在一个 /plugins 工作目录上的文件夹( System.getProperty("user.dir") + "\\plugins" ). 我的程序将找到该文件夹( /plugins )在工作目录上。如果不存在,它将创建一个新文件夹。如果存在,它将找到所有 jar 文件夹。创建一个 PluginClassLoader [源代码]添加插件。
我希望插件会被添加到我的程序中,类加载器会创建它们的示例。通过此测试代码:

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));
    }

如果插件无效/加载时导致错误,将引发此异常。我不知道为什么我的程序找不到扩展自己的插件。。。

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
nsc4cvqm

nsc4cvqm1#

经过几个小时的调试,我终于找到了答案。
我说错话了 ClassLoader 对我的执行 PluginClassLoader .

相关问题