簡體   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