我为Java编写了一个非常简单的Web服务器接口,允许用户将自己的jar存档放入文件夹,当服务器启动时,它们将被加载。
该存档是一个定义主类等的文本文件,但我的插件加载器只加载文件中定义的类。因此,当我使用第二个类并想要访问它(Example e = new Example()
)时,它将导致NoClassDefFoundError
- 异常:
Exception in thread "main" java.lang.NoClassDefFoundError: de/Ercksen/WebserverPlugin/Plugin/WasWillstDu
at de.Ercksen.WebserverPlugin.Plugin.MainPlugin.onEnable(MainPlugin.java:17)
at de.Ercksen.Webserver.Webserver.initPlugins(Webserver.java:236)
at de.Ercksen.Webserver.Webserver.loadPlugins(Webserver.java:231)
at de.Ercksen.Webserver.Webserver.execute(Webserver.java:37)
at de.Ercksen.Webserver.Webserver.main(Webserver.java:30)
Caused by: java.lang.ClassNotFoundException:
Ercksen.WebserverPlugin.Plugin.WasWillstDu
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)
... 5 more
是否有一种方法可以简单地加载.jar-archive中的所有类?还是其他任何想法?
我的班级加载器:
@SuppressWarnings("unchecked")
public static Class<? extends Plugin> loadPluginClass(File file, String path) throws ClassNotFoundException, ClassCastException, IOException {
URLClassLoader loader = new URLClassLoader(new URL[] {file.toURI().toURL()});
Class<?> c = loader.loadClass(path);
loader.close();
return (Class<? extends Plugin>) c;
}