从类路径之外的文件夹加载类时,如何修复“ ClassNotFoundError”

时间:2019-04-12 19:57:04

标签: java file class classloading

我正在编写一个模块系统,该模块系统将具有附加功能的模块加载到我的Spigot插件中。当我尝试从模块动态加载类时,出现ClassNotFoundException。

我正在使用类加载器加载模块的jar文件,这些文件存储在一个单独的文件夹中,该文件夹也称为“模块”。我寻找了一些有关类加载器的教程,据我所知,我在这段代码中没有做错任何事情。

这是我的代码:

        File modulesFolder = new File(instance.getDataFolder(), "modules/");
        if (!modulesFolder.exists())
            modulesFolder.mkdirs();

        System.out.println("scanning modules folder...");
        for (File f:modulesFolder.listFiles()) {
            if (f.isFile() && f.getName().endsWith(".jar")) {
                String moduleName = LCStringUtils.trimString(f.getName(), ".jar");
                Class<?> moduleClass = null;
                try {
                    ClassLoader loader = URLClassLoader.newInstance(
                            new URL[] {f.toURI().toURL()},
                            getClass().getClassLoader()
                        );

                    moduleClass = Class.forName("net.libercraft." + moduleName.toLowerCase() + "." + moduleName, true, loader);
                } catch (ClassNotFoundException | MalformedURLException e) {
                    e.printStackTrace();
                }
                if (moduleClass == null || !Module.class.isAssignableFrom(moduleClass))
                    continue;
                System.out.println(moduleClass.getName());
            }
        }

我很确定班级应该在那里。该代码能够加载文件名,而文件名是获取类路径所必需的。正如您在LiberEffects.jar的文件结构中看到的那样,它还包含一个名为LiberEffects的类。我已将此jar文件放置在modules文件夹中,但是当它尝试加载net.libercraft.libereffects.LiberEffects类时,它将引发错误。

文件结构: https://i.imgur.com/EvHBt10.png

1 个答案:

答案 0 :(得分:0)

?您是否尝试过放置目录的整个路径而不是"modules/"?例如C:\Users\userName\Documents\NetBeansProjects\Erste_projeckt\modules