Java 动态加载 JAR:NoClassDefFoundError
Java loading JAR dynamically: NoClassDefFoundError
假设我有一个主 class 应用程序,它使用 URLClassLoader:
加载子目录 plugins 中的所有 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 都包含一个实现接口插件的 class。
+-- Main.jar
| +-- App.class
| +-- Plugin.class
|
+-- Plugins/
| +-- PluginTest.jar
| +-- plugintest
| +-- PluginTest.class
| +-- Two.class
如果我只在 PluginTest class 中编写代码,那一切都很好。但是当我尝试从 PluginTest 访问 Two 时,我遇到了一个大错误:
Exception in thread "Thread-4" java.lang.NoClassDefFoundError: plugintest/Two
[...]
我应该如何正确加载 class?需要帮忙!谢谢
不要关闭类加载器。
删除 cl.close();
声明。
假设我有一个主 class 应用程序,它使用 URLClassLoader:
加载子目录 plugins 中的所有 jarpublic 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 都包含一个实现接口插件的 class。
+-- Main.jar
| +-- App.class
| +-- Plugin.class
|
+-- Plugins/
| +-- PluginTest.jar
| +-- plugintest
| +-- PluginTest.class
| +-- Two.class
如果我只在 PluginTest class 中编写代码,那一切都很好。但是当我尝试从 PluginTest 访问 Two 时,我遇到了一个大错误:
Exception in thread "Thread-4" java.lang.NoClassDefFoundError: plugintest/Two
[...]
我应该如何正确加载 class?需要帮忙!谢谢
不要关闭类加载器。
删除 cl.close();
声明。