【问题标题】:How do you load a class that is not in the classpath & is in a jar? [duplicate]您如何加载不在类路径中且在 jar 中的类? [复制]
【发布时间】:2019-10-18 04:47:44
【问题描述】:

我想加载一个 jar 中的类。

我已经尝试使用此代码加载类:

URL dirUrl = jarFile.toURL();
URLClassLoader ucl = new URLClassLoader(new URL[] {dirUrl}, getClass().getClassLoader());
Class<?> clazz = ucl.loadClass(mainClass);
ucl.close();

我得到一个找不到类的异常:

java.lang.RuntimeException: java.lang.ClassNotFoundException: net.api.main
        at net.al.Main.onEnable(Main.java:39) ~[?:?]
        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 org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchServerCommand(CraftServer.java:627) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.aO(DedicatedServer.java:412) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:375) [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(Unknown Source) [?:1.8.0_211]
Caused by: java.lang.ClassNotFoundException: net.api.main
        at java.net.URLClassLoader.findClass(Unknown Source) ~[?:1.8.0_211]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_211]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_211]
        at net.al.addon.AddonLoader.loadAddons(AddonLoader.java:129) ~[?:?]
        at net.al.Main.onEnable(Main.java:36) ~[?:?]
        ... 16 more

【问题讨论】:

标签: java


【解决方案1】:

请检查 net.api.main 是否存在

或检查变量 jarFile 和 mainClass

【讨论】:

    【解决方案2】:

    我通过将 jar 添加到类路径来修复它。 代码到文件到 jar 路径:

    public static void addURLToClassPath(URL url) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException
        {
            URLClassLoader classLoader = (URLClassLoader) MyClass.class.getClassLoader();
            @SuppressWarnings("rawtypes")
            Class clazz = URLClassLoader.class;
            @SuppressWarnings("unchecked")
            Method method = clazz.getDeclaredMethod("addURL", new Class[] { URL.class });
            method.setAccessible(true);
            method.invoke(classLoader, new Object[] { url });
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2014-12-06
      • 2018-04-10
      • 2012-07-12
      • 2015-09-10
      • 2015-09-10
      相关资源
      最近更新 更多