Java ResourceBundle.getBundle 如何加载属性文件?

How does Java ResourceBundle.getBundle load properties file?

我花了一些时间尝试加载属性文件,但找不到任何有效的解决方案。这是我的设置图片。

属性文件位置:/sandbox/resources/properties/MessageBundle_en_US.properties

应用程序位置:/sandbox/src/main/java/com/app/sandbox/App.java

不确定发生了什么。我尝试了几种组合,但就是无法通过异常。我什至尝试了文件夹的整个路径。谁能告诉我 ResourceBundle.getBundle() 方法如何查找属性文件?

更新 1: 此解决方案在几分钟后停止工作:

ResourceBundle mybundle = ResourceBundle.getBundle("MessageBundle");

更新 2: 以上解决方案在我上次 运行 期间不再有效。所以我改成了:

ResourceBundle mybundle = ResourceBundle.getBundle("properties/MessageBundle");

它奏效了。 ResourceBundle 查找属性文件的方式似乎存在缓存问题。

我仍然不确定 ResourceBundle class 如何查找属性文件。它说要传递一个 "baseName" 参数:

baseName - the base name of the resource bundle, a fully qualified class name

https://docs.oracle.com/javase/7/docs/api/java/util/ResourceBundle.html#getBundle(java.lang.String)

但尚不清楚它是如何开始寻找文件的。它是否从项目目录的根目录开始查找?如果有人能回答这个问题,那就太好了。 完全限定的 class 名称 是什么意思?我不认为 "properties.MessageBundle" 是完全合格的。

尝试如下使用;

ResourceBundle bundle = ResourceBundle.getBundle("properties/MessageBundle");

是的,应该是这样

ResourceBundle mybundle = ResourceBundle.getBundle("MessageBundle");

它能找到它的原因,在属性包中而不指定整个路径,是因为 Java 知道默认情况下包应该在那个包中,而且它不需要其他部分。 因此,如果您使用整个路径,如:"/sandbox/resources/properties/MessageBundle",Java 将其解释为:

"/sandbox/resources/properties/MessageBundle/sandbox/resources/properties/MessageBundle"

这显然是不正确的。因此,如果您需要在属性包中创建更多包,只需从那里开始,而不是从项目的根目录开始。