1

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

这有效:

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()才能得到它?

任何帮助表示赞赏!

4

2 回答 2

2

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

换句话说,如果some.jarcontains pkg/thingy.png,那么getResource("pkg/thingy.png")会成功。

另请注意,它会getResource(String)返回一个指向资源的 URL……一个您已经拥有的 URL myURL

于 2012-03-28T16:26:41.903 回答
0

我怀疑你想要:

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

请注意缺少前导斜杠。这是假设你的类加载器的“根”是有效的repository。仅从 URL 很难分辨。

另一种方法是使用:

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

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

于 2012-03-28T16:21:17.710 回答