ClassNotFoundException после загрузки файла класса - PullRequest
0 голосов
/ 08 апреля 2020

Я пытался загрузить классы jar-файла с помощью URLClassloader. Но у меня есть одна проблема: если я создаю новый экземпляр из загруженного класса, я получаю ClassNotFoundException, и я не знаю, где ошибка. Вот мой код для загрузки классов:

private void loadClasses() throws IOException, ClassNotFoundException {
    JarFile[] jarFile = {
        new JarFile("lib/core-api-bukkit-0.0.1-SNAPSHOT.jar"),
        new JarFile("lib/core-api-common-0.0.1-SNAPSHOT.jar"),
        new JarFile("lib/core-plugin-common-0.0.1-SNAPSHOT.jar"),
        new JarFile("lib/core-db-common-0.0.1-SNAPSHOT.jar")
    };

    for (JarFile currentFile : jarFile) {
        try {
            System.out.println("Current File: " + currentFile.getName());
            Enumeration<JarEntry> e = currentFile.entries();

            URL[] urls = { new URL("jar:file:" + currentFile.getName() + "!/") };
            URLClassLoader cl = URLClassLoader.newInstance(urls, getClassLoader());

            while (e.hasMoreElements()) {
                JarEntry je = e.nextElement();
                if (je.isDirectory() || !je.getName().endsWith(".class")) {
                    continue;
                }
                String className = je.getName().substring(0,je.getName().length() - 6);
                className = className.replace('/', '.');
                Class<?> c = cl.loadClass(className);
                System.out.println("Load class " + c.getName());
            }
        } finally {
            currentFile.close();
        }
    }
}

Вот вывод консоли:

java.lang.NoClassDefFoundError: at/cybercraft/core/plugin/common/player/Player
    at at.cybercraft.core.plugin.bukkit.BukkitCorePlugin.registerClasses(BukkitCorePlugin.java:28) ~[?:?]
    at at.cybercraft.core.plugin.bukkit.BukkitCorePlugin.onEnable(BukkitCorePlugin.java:22) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:340) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:357) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:317) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.craftbukkit.v1_8_R3.CraftServer.reload(CraftServer.java:741) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.Bukkit.reload(Bukkit.java:535) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:25) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1162) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:997) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_242]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_242]
    at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot.jar:git-Spigot-db6de12-18fbb24]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_242]
Caused by: java.lang.ClassNotFoundException: at.cybercraft.core.plugin.common.player.Player
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[?:1.8.0_242]
    at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:101) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:86) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:419) ~[?:1.8.0_242]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:352) ~[?:1.8.0_242]
    ... 25 more

С уважением, Даниэль

1 Ответ

0 голосов
/ 08 апреля 2020

Вы получаете сообщение Error occurred while enabling BukkitCorePlugin в трассировке стека вместе с NoClassDefFoundError.

То, что выглядит , похоже, что ваш код загружает класс, и когда он инициализируется, происходит сбой, поскольку требуемый класс не может быть загружен соответствующим загрузчиком классов.

Это может потому что вы создаете новый экземпляр ClassLoader для каждого jar, и загрузчик классов не зависит друг от друга.

Обычно, когда загрузчик классов не может найти сам класс, он делегирует его родителю (фактически , он запрашивает у родителя first , и только когда родитель не обнаруживает запрошенный класс, он выглядит сам). У ваших загрузчиков классов есть только общий родитель, но они не связаны друг с другом. Поэтому, когда класс из lib/core-api-common-0.0.1-SNAPSHOT.jar ссылается на класс, расположенный в lib/core-api-bukkit-0.0.1-SNAPSHOT.jar, он не может быть найден, хотя он уже загружен.

...