【发布时间】: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