【问题标题】:NoClassDefFoundError only for few classes when loading classes from external jar从外部 jar 加载类时,NoClassDefFoundError 仅适用于少数类
【发布时间】: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


【解决方案1】:

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

有关其他信息,请参阅: java.lang.NoClassDefFoundError exception on some devices

【讨论】:

  • 这个应用程序在我的 Windows 上的 jre 8 环境上运行。不应该有andriod的限制
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    java.lang.NoClassDefFoundErrorjava.lang.NoSuchMethodError 在运行时被访问,并且类加载器无法加载类,因为它不存在于类路径中。如果您的程序从不尝试在运行时访问类路径中不存在的类或方法,那么您将永远不会得到NoClassDefFoundErrorNoSuchMethodError

    【讨论】:

    • 他没有要求定义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2011-01-22
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多