You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用URLClassLoader加载Jar时出现ClassNotFoundException问题求助

解决Jar包加载时的ClassNotFoundException问题

嘿,我瞅了下你这段代码和Jar包结构,问题出在Jar URL的构造格式不对,导致类加载器压根没法正确识别你的Jar包内容。

问题根源

Jar URL有严格的标准格式:jar:file:/<Jar包的绝对路径>!/,而你当前用new URL("jar", "", jarFile.getAbsolutePath() + "!/")构造出来的URL不符合这个规范,类加载器自然找不到com.mycompany.dog.Dog类。另外你提到Jar包里只有Dog$1.class,这是内部类的文件,主类Dog.class必须存在才能被成功加载哦。

修正后的代码方案

这里给你两种可行的修正方式:

方案一:通过File的URI转成标准URL

File jarFile = new File(jar);
// 先转成file协议的URL,再拼接成jar URL
URL fileUrl = jarFile.toURI().toURL();
URL jarUrl = new URL("jar", "", fileUrl.toString() + "!/");
URLClassLoader loader = new URLClassLoader(new URL[] {jarUrl}, ClassLoader.getSystemClassLoader());
Class<? extends Animal> clazz = (Class<? extends Animal>)loader.loadClass("com.mycompany.dog.Dog");

方案二:直接拼接标准格式的URL字符串

File jarFile = new File(jar);
// Windows系统下要把\替换成/,避免URL解析错误
String jarPath = jarFile.getAbsolutePath().replace("\\", "/");
URL jarUrl = new URL("jar:file:" + jarPath + "!/");
URLClassLoader loader = new URLClassLoader(new URL[] {jarUrl}, ClassLoader.getSystemClassLoader());
Class<? extends Animal> clazz = (Class<? extends Animal>)loader.loadClass("com.mycompany.dog.Dog");

额外注意事项

  • 务必确认Jar包内存在com/mycompany/dog/Dog.class文件,Dog$1.class只是内部类,不能替代主类
  • Windows系统下路径分隔符是反斜杠\,必须替换成正斜杠/才能让URL正确解析

内容的提问来源于stack exchange,提问作者J. Pichardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:17:19