使用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
相关产品推荐
相关产品推荐

