我最近做了一个 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
1条答案
按热度按时间nsc4cvqm1#
经过几个小时的调试,我终于找到了答案。
我说错话了
ClassLoader
对我的执行PluginClassLoader
.