我最近正在制作一个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
答案 0 :(得分:0)
通过几个小时的调试,我终于找到了答案。
我在ClassLoader
的实施中指定了错误的PluginClassLoader
。