首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何加载不在类路径中而在jar中的类?

如何加载不在类路径中而在jar中的类?
EN

Stack Overflow用户
提问于 2019-06-02 17:07:09
回答 2查看 314关注 0票数 -2

我想加载一个jar中的类。

我已经尝试使用下面的代码加载这个类:

代码语言:javascript
复制
URL dirUrl = jarFile.toURL();
URLClassLoader ucl = new URLClassLoader(new URL[] {dirUrl}, getClass().getClassLoader());
Class<?> clazz = ucl.loadClass(mainClass);
ucl.close();

我得到一个异常,它找不到这个类:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-03 01:25:30

我通过将jar添加到类路径修复了这个问题。位于文件到jar路径的代码:

代码语言:javascript
复制
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 });
    }
票数 0
EN

Stack Overflow用户

发布于 2019-06-02 17:34:54

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

或者检查变量jarFile和mainClass

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56413658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档