Java 动态加载 JAR:NoClassDefFoundError



假设我有一个主类应用程序,它使用 URLClassLoader 加载子目录插件中的所有 jar:

public class App(){
public static void main(String[] args){
for(File f : new File("plugins").listFiles()){
URL[] urls = { new URL("jar:file:" + "plugins/" + f.getName() + ".jar" + "!/") };
URLClassLoader cl = URLClassLoader.newInstance(urls);
Class<?> clazz = cl.loadClass(f.getName().toLowerCase()+"."+f.getName());
cl.close();
Plugin p = ((Plugin) clazz.newInstance());
}
}
}

所有这些 jar 都包含一个实现接口插件的类。

+-- Main.jar
|    +-- App.class
|    +-- Plugin.class
|
+-- Plugins/
|    +-- PluginTest.jar
|         +-- plugintest
|              +-- PluginTest.class
|              +-- Two.class

如果我只在插件测试类中编写代码,这一切都可以正常工作。但是一旦我尝试从插件测试访问两个,我就会遇到一个大错误:

Exception in thread "Thread-4" java.lang.NoClassDefFoundError: plugintest/Two
[...]

我应该如何正确加载类?需要帮助!谢谢。

不要关闭类加载器。

删除cl.close();语句。

最新更新