【问题标题】:ClassNotFoundException after loading the classfile加载类文件后出现 ClassNotFoundException
【发布时间】:2020-04-08 13:47:09
【问题描述】:

我尝试使用 URLClassloader 加载 jar 文件的类。 但是我有一个问题:如果我从我加载的类中创建一个新实例,我会得到一个 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

此致 丹尼尔

【问题讨论】:

  • 哪一行发出FileNotFoundException?请添加异常的stacktrace!!
  • 我添加了输出。
  • 输出中没有FileNotFoundException
  • 哦,我很抱歉这个错误.. 我的意思是 ClassNotFoundException。
  • 好的,现在将堆栈跟踪(请仅堆栈跟踪)复制到问题中,我们可以处理它......

标签: java file url classloader urlclassloader


【解决方案1】:

您会在堆栈跟踪中收到消息Error occurred while enabling BukkitCorePlugin,以及NoClassDefFoundError

看起来你的代码加载了一个类,当它被初始化时,由于相应的类加载器无法加载所需的类而失败。

这可能是因为您为每个 jar 创建了一个 ClassLoader 的新实例,而这些类加载器并不相互依赖。

通常,当一个类加载器自己找不到一个类时,它会委托给它的父类(实际上,它会先询问父类,并且只有当父类没有提出所请求的类时,它看起来像自己)。您的类加载器确实只有一个共同的父级,但彼此不相关。因此,当来自lib/core-api-common-0.0.1-SNAPSHOT.jar 的类引用位于lib/core-api-bukkit-0.0.1-SNAPSHOT.jar 中的类时,虽然它已经加载,但无法找到。

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2011-08-28
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    相关资源
    最近更新 更多