【问题标题】:getResource("/some.jar") returns null, although "some.jar" exists in getURLs()getResource("/some.jar") 返回 null,尽管 getURLs() 中存在 "some.jar"
【发布时间】:2012-04-12 07:00:06
【问题描述】:

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

这行得通:

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

感谢任何帮助!

【问题讨论】:

    标签: java url classpath classloader getresource


    【解决方案1】:

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

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

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

    【讨论】:

    • 天啊,我想,就是这样,谢谢!那么使用 getResource() 是完全错误的吗?像我一样使用 getURLs() 查找 URL 是首选方式吗?
    • 这取决于你想要做什么。如果您尝试从 inside 类路径中的一个 JAR 访问资源,请使用 getResource(...)。如果您试图获得对构成类路径的 JAR 的替代访问——例如,对所有可用图像进行详尽扫描——请使用 getURLs(...)。以我的经验,只有调试代码和框架代码需要求助于getURLs
    • 是的,没错,我在开发过程中只需要那个代码。我希望所有开发人员都将 jar 文件放在他们的 Maven 存储库中,该存储库位于类路径中。但是,对于发布,我必须将它放在其他地方(可能在发布 jar 文件中)。再次感谢您的解释!
    【解决方案2】:

    我怀疑你想要:

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

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

    另一种方法是使用:

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

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

    【讨论】:

    • 不幸的是,两者都不起作用。但是由于 Dilum Ranatunga 在他的回答中指出的,我可能永远无法使用 getResource() 找到它。 ;-) 但感谢您的回答!
    猜你喜欢
    • 2010-10-12
    • 2018-03-09
    • 2016-03-22
    • 1970-01-01
    • 2014-07-14
    • 2012-07-10
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多