Guava Resources getResource()第一次没有工作

时间:2015-07-27 15:11:02

标签: java classpath classloader guava urlclassloader

我在我的代码中观察到一种奇怪的行为。 我有这段代码:

String propsPath = Resources.getResource(
                    "xyz.properties").getPath();

我总是得到这个错误

  

java.lang.IllegalArgumentException:找不到资源xyz.properties。

我第一次调用使用上面代码块的方法。在随后的调用中,该方法工作正常,并能够正确定位资源。在检查getResource代码后,我可以看到

public static URL getResource(String resourceName) {
    URL url = Resources.class.getClassLoader().getResource(resourceName);
    checkArgument(url != null, "resource %s not found.", resourceName);
    return url;
  }

一旦调试肯定,第一次获得的urlnull。相同的代码如何工作呢?

我在getClassLoader

的javadoc中找到了这个
  

返回类的类加载器。一些实现可能会使用   null表示引导类加载器。这个方法会返回   如果此类由引导程序加载,则在此类实现中为null   类加载器。

有人可以解释一下bootstrap class loader是什么?我的代码是第一次使用相同的,但下次使用其他类加载器?或者这是一个完全不同的问题吗?

1 个答案:

答案 0 :(得分:0)

您可能想尝试较新版本的番石榴。我不知道它是否可以解决您的问题,但不久前我们进行了更改以使用Thread.currentThread().getContextClassLoader(),如果它存在而不是使用Resources.class.getClassLoader()

另请注意,getClassLoader()未归还null ...如果是NullPointerException,您将获得getResource("xyz.properties")null正在返回db.mycollection.find({ "_id": { "$nin": [ "id1","id2" ]}}, { "_id": 1 }) ,这意味着它无法找到该资源。我不确定为什么它会对后续的电话起作用,但不是第一次......这很奇怪。