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



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

这项工作:

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位于类路径中,如getURLs()
所示但是,我必须如何在getResource()中寻址才能获得它呢?

感谢您的帮助!

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

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

还要注意,getResource(String)返回资源的URL。。。myURL中已有的URL。

我怀疑你想要:

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

请注意缺少前导斜杠。这是假设类加载器的"根"实际上是repository。仅仅从URL很难分辨。

另一种选择是使用:

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

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

最新更新