繁体   English   中英

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

[英]NoClassDefFoundError only for few classes when loading classes from external jar

我正在尝试加载外部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”方法将其自身加载,但该方法也无法加载。 有人知道如何解决这个问题吗?

没有看到错误原因就很难知道。

通常,这是由于类路径中不包含依赖项(类加载器无法加载超类而导致的ClassNotFoundException封装在NoClassDefFoundError )或静态字段或块中的某些运行时异常引起的。

值得指出NoClassDefFoundError出色解释: https : //stackoverflow.com/a/5756989/4483113

您的应用似乎达到了65K方法的限制,这是Android相当著名的限制。 来源: https : //developer.android.com/tools/building/multidex.html#dev-build

有关更多信息,请参见: 一些设备上的java.lang.NoClassDefFoundError异常

当访问java.lang.NoClassDefFoundErrorjava.lang.NoSuchMethodError时,它们将在运行时抛出,并且类加载器无法加载类,因为它们不在类路径中。 如果您的程序从不尝试在运行时访问类路径中不存在的类或方法,则将永远不会出现NoClassDefFoundErrorNoSuchMethodError

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM