Java动态加载JAR:NoClassDefFoundError

时间:2017-07-04 14:11:52

标签: java classloader

假设我有一个主类App,它使用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包含一个实现接口插件的类。

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

如果我在PluginTest类中编写代码,那一切都正常。但是一旦我尝试从PluginTest访问Two,我就会收到一个大错误:

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

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

1 个答案:

答案 0 :(得分:1)

请勿关闭您的类加载器。

删除cl.close();声明。