代码之家  ›  专栏  ›  技术社区  ›  J. Pichardo

URLClassLoader加载Jar时找不到ClassNotFound

  •  1
  • J. Pichardo  · 技术社区  · 7 年前

    使用以下代码,我得到一个 ClassNotFoundException

    File jarFile = new File(jar);
          URL jarUrl = new URL("jar", "", jarFile.getAbsolutePath() + "!/");
    
    URLClassLoader loader = new URLClassLoader(
          new URL[] {jarUrl}, ClassLoader.getSystemClassLoader());
    
    Class<? extends Animal> clazz =
          (Class<? extends Animal>)loader.loadClass("com.mycompany.dog.Dog");
    

    罐子的内容如下:

    META-INF/ 
    META-INF/MANIFEST.MF 
    com/ 
    com/mycompany/ 
    com/mycompany/dog/ 
    com/mycompany/dog/Dog$1.class 
    com/mycompany/dog/Dog.class 
    META-INF/maven/ 
    META-INF/maven/com.mycompany.app/ 
    META-INF/maven/com.mycompany.app/dog/ 
    META-INF/maven/com.mycompany.app/dog/pom.xml 
    META-INF/maven/com.mycompany.app/dog/pom.properties 
    com/mycompany/app/ 
    com/mycompany/app/Animal.class 
    com/mycompany/app/ActionLog.class 
    META-INF/maven/com.mycompany.app/animal/ 
    META-INF/maven/com.mycompany.app/animal/pom.xml 
    META-INF/maven/com.mycompany.app/animal/pom.properties
    

    我做错什么了吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Andrew Thompson    7 年前

    我不相信试图通过URL构造函数创建Jar URL,因为它可能不同于通过调用 File.toURI().toURL() (构成有效URL)。

    这里有一个例子。

    import java.net.URL;
    import java.io.File;
    
    public class JarURL {
    
        public static void main(String[] args) throws Exception {
            File f = new File("C:\\the.jar");
            URL jarUrl1 = new URL("jar", "", f.getAbsolutePath() + "!/");
            URL jarUrl2 = f.toURI().toURL();
            System.out.println("jarUrl1: " + jarUrl1);
            System.out.println("jarUrl2: " + jarUrl2);
        }
    }
    

    产生输出:

    jarUrl1: jar:C:\the.jar!/
    jarUrl2: file:/C:/the.jar