java - 插件系统中的 java.lang.NoClassDefFoundError
问题描述
所以,我有一个程序,我想用插件或模块进行扩展。
我将它们从文件夹中加载出来并让 ClassLoader 循环遍历所有文件,以查看它们是否具有我的软件的 Super 类
然后我得到这个异常:
java.lang.NoClassDefFoundError: me/mnjg123/privacy1/de/privacy2/system/core/objects/Feature
at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_242]
at java.lang.ClassLoader.defineClass(ClassLoader.java:757) ~[?:1.8.0_242]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[?:1.8.0_242]
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468) ~[?:1.8.0_242]
at java.net.URLClassLoader.access$100(URLClassLoader.java:74) ~[?:1.8.0_242]
at java.net.URLClassLoader$1.run(URLClassLoader.java:369) ~[?:1.8.0_242]
at java.net.URLClassLoader$1.run(URLClassLoader.java:363) ~[?:1.8.0_242]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_242]
at java.net.URLClassLoader.findClass(URLClassLoader.java:362) ~[?:1.8.0_242]
at java.lang.ClassLoader.loadClass(ClassLoader.java:419) ~[?:1.8.0_242]
at java.lang.ClassLoader.loadClass(ClassLoader.java:352) ~[?:1.8.0_242]
at me.mnjg123.ragemade.de.bungee.system.core.handlers.FeatureHandler.loadFeatures(FeatureHandler.java:88) ~[?:?]
at me.mnjg123.privacy1.de.privacy2.system.core.privacy3.addFeature(privacy3.java:40) ~[?:?]
at me.mnjg123.privacy1.de.privacy2.system.core.privacy3.onEnable(privacy3.java:33) ~[?:?]
Caused by: java.lang.ClassNotFoundException: me.mnjg123.privacy1.de.privacy2.system.core.objects.Feature
at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[?:1.8.0_242]
at java.lang.ClassLoader.loadClass(ClassLoader.java:419) ~[?:1.8.0_242]
at java.lang.ClassLoader.loadClass(ClassLoader.java:352) ~[?:1.8.0_242]
这是我的类加载器:
public List<Feature> loadFeatures() throws FeatureExeption {
List<Feature> features = new ArrayList<>();
try {
String path = new File("").getAbsolutePath();
File folder = new File(path + "/plugins/privacy3/addons/");
if(!folder.exists())
folder.mkdirs();
File[] files = folder.listFiles();
if (files != null) {
for (File plugin : files) {
ZipInputStream zip = new ZipInputStream(new FileInputStream(plugin));
List<String> classes = new ArrayList<>();
for(ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
if(!entry.isDirectory() && entry.getName().endsWith(".class")) {
String className = entry.getName().replace("/", ".");
classes.add(className.substring(0, className.length() - ".class".length()));
}
}
URLClassLoader classloader = new URLClassLoader(new URL[]{plugin.toURI().toURL()});
for(String className : classes) {
line 88 -> Class<?> cl = classloader.loadClass(className);
}
zip.close();
classloader.close();
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return features;
}
这是我要加载的类
package me.mnjg123.featuretest;
import me.mnjg123.privacy1.de.privacy2.system.core.objects.Feature;
/**
* @author mnjg123
*
*/
public class PayLoad extends Feature {
/**
* @param name
*/
public PayLoad() {
super("test", false);
}
@Override
public void onEnable() {
System.out.println("true");
super.onEnable();
}
}
我做错了什么?我该如何改进它?
解决方案
一般来说,NoClassDefFoundError是指构建时缺少一些组件,导致使用时抛出NoClassDefFoundError。
很明显,这个路径下找不到文件:me/mnjg123/privacy1/de/privacy2/system/core/objects/Feature
解决方案是重建一次
希望这可以帮助你。
推荐阅读
- php - $table->stamps() 记录在哪里以及如何回滚?
- javascript - 是否可以为 graphql-yoga 输出 JSON 格式的日志?
- azure - Istio 为虚拟服务中映射的 URL 抛出 404
- r - 如何在 R 中的列的开头插入“1”?
- python-3.x - 如何调试此 AttributeError:'int' 对象没有属性 'increase'?
- python - 如何使用 openpyxl 在 Excel 工作表中插入数组公式?
- unit-testing - 在 Spock 中使用模拟单元测试流畅的 API
- kubernetes - 是否可以将新 pod 动态添加到现有部署中?
- javascript - Nightwatch 变量范围和访问外部 .element 调用
- r - 您如何在 R Studio 中查看查看器项目?