gpt4 book ai didi

java - 从外部 jar 加载类时,NoClassDefFoundError 仅适用于少数类

转载 作者:行者123 更新时间:2023-11-30 07:32:39 32 4
gpt4 key购买 nike

我正在尝试加载外部 jar 中包含的所有类。我无法将 jar 作为库包含在我的项目中,我必须从用户定义的未知位置加载它。到目前为止,我正在使用扩展 urlclassloader 的类加载器来加载类。来源如下:

public class JarLoader extends URLClassLoader {

public JarLoader() {
super(new URL[0], ClassLoader.getSystemClassLoader());
}

private static final String ENDING_CLASS = ".class", URL_PREFIX = "file:";

public final Set<Class<?>> loadCraftbukkit(final JarFile pJar) {
if (pJar != null) {

try {
addURL(new URL(URL_PREFIX + pJar.getName()));
final Enumeration<JarEntry> entries = pJar.entries();
final Set<Class<?>> loadedClasses = new HashSet<>();
while (entries.hasMoreElements()) {
final JarEntry entry = entries.nextElement();
final String className = getClassName(entry);
if (className != null) {
try {
final Class<?> loadedClass = loadClass(className);
loadedClasses.add(loadedClass);
} catch (ClassNotFoundException | NoClassDefFoundError pExc) {
// ignore invalid class
}
}
}
return loadedClasses;
} catch (MalformedURLException | ClassFormatError ignore) {
// won't happen if legal jarfile
}
}
return null;
}

private final String getClassName(final JarEntry pEntry) {
final String name = pEntry.getName();
if (name.endsWith(ENDING_CLASS)) {
return name.substring(0, name.lastIndexOf(ENDING_CLASS)).replace('/', '.');
}
return null;
}
}

奇怪的是,在 1800 多个类中,我只得到了 37 个类抛出的“NoClassDefFoundError”。这些类未加载,因此我的程序因空指针发生而无法工作。

这是我正在加载的 jar :http://www.file-upload.net/download-11374317/craftbukkit-1.8.8.jar.html
这是我能找到的来源:https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse
这是我能找到的文档:https://hub.spigotmc.org/javadocs/bukkit/

我怎样才能加载这 37 个类?我尝试将它们作为字节读取,并使用类加载器的“defineClass”方法自行加载它们,但此方法也无法加载它们。有人知道如何解决这个问题吗?

最佳答案

如果不看到错误原因,很难知道。

通常这是由于类路径中未包含依赖项而导致的(由于类加载器无法加载父类(super class)而导致的 ClassNotFoundException 被包装在 NoClassDefFoundError 中)或静态字段或 block 中的一些运行时异常。

值得指出的是 NoClassDefFoundError 的精彩解释:https://stackoverflow.com/a/5756989/4483113

关于java - 从外部 jar 加载类时,NoClassDefFoundError 仅适用于少数类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35866854/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com