【发布时间】:2016-06-22 08:49:23
【问题描述】:
我正在尝试加载包含在外部 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”抛出。这些类没有加载,并且由于 Nullpointers 发生后我的程序无法运行。
这是我正在加载的 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”自行加载它们,但此方法也无法加载它们。有人知道如何解决这个问题吗?
【问题讨论】:
-
可以添加堆栈跟踪吗?
-
通常在加载缺少依赖类的类时会出现错误。就像您的用户 JAR 需要另一个一样。
-
我面临着完全相同的问题。你找到解决办法了吗?
-
@HariRam 不,抱歉。实际上可能是下面 idelvall 所述的限制。
标签: java jar classloader external