getResource(“/ some.jar”)返回null,尽管getURLs()中存在“some.jar”

时间:2012-03-28 16:18:41

标签: java url classpath classloader getresource

几个小时后,我放弃了调试以下内容:

这有效:

URL[] urls = ((URLClassLoader) MyClass.class.getClassLoader()).getURLs();
    URL myURL = null;
    for (URL url : urls) {
        if (url.getPath().endsWith("some.jar")) {
            myURL = url;
    }   
}
System.out.println(myURL);

返回

file:/C:/Users/Me/.m2/repository/path/to/some.jar

但是,以下所有内容都会返回null

MyClass.class.getClassLoader()).getResource("/some.jar");
MyClass.class.getClassLoader()).getResource("some.jar");
MyClass.class.getClassLoader()).getResource("/C:/Users/Me/.m2/repository/path/to/some.jar");
MyClass.class.getClassLoader()).getResource("/path/to/some.jar");

正如你所看到的,如果可能的话,我想通过不绝对地通过它获得用户的maven存储库的jar。 jar位于类路径中,如getURLs()所示 但是,为了得到它,我必须在getResource()解决这个问题?

感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

URLClassLoader.getURLs()将URL返回到类路径中的目录和JAR。 ClassLoader.getResource(String)正在寻找里面的资源类路径。因此,除非类路径中的某个JAR /目录包含some.jar,否则预计会失败。

换句话说,如果some.jar包含pkg/thingy.png,则getResource("pkg/thingy.png")会成功。

另请注意,getResource(String)会返回资源的网址...您在myURL中已有的网址。

答案 1 :(得分:1)

我怀疑你想要:

MyClass.class.getClassLoader().getResource("path/to/some.jar")

注意缺少前导斜线。假设您的类加载器的“根”实际上是repository。很难从网址上说出来。

另一种方法是使用:

MyClass.class.getResource("/path/to/some.jar")

请注意,这次 是一个前导斜杠。基本上类加载器没有任何“相对”名称的概念,而类则没有。