几个小时后,我放弃了调试以下内容:
这项工作:
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")
请注意,这一次是一个前导斜杠。基本上,类加载器没有任何"相对"名称的概念,而类有。