我正在编写一个模块系统,该系统将具有附加功能的模块加载到我的 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文件放在模块文件夹中,但是当它尝试加载net.libercraft.libereffects.LiberEffects类时,它会抛出错误。
文件结构:https://i.stack.imgur.com/rr99N.png
您是否尝试过放置目录的整个路径而不是"modules/"
?例如C:UsersuserNameDocumentsNetBeansProjectsErste_projecktmodules
.