从属性文件加载的Java ResourceBundle缺少基本名称

问题描述

在我的程序中,ResourceBundle用于本地化控制台输出消息。资源捆绑包是从属性文件加载的,当前只有带有英语消息的认语言环境。打包方式位于klfr.sof.soFMessages(即文件src/klfr/sof/SOFMessages.properties)。可以毫无问题地找到并装入此资源包,例如:

ResourceBundle.getBundle("klfr.sof.soFMessages");

对于大多数目的和我的大多数项目,我只是直接使用了此捆绑包,它从未造成任何问题。语言环境似乎也可以正常工作。

但是,为了将本地化扩展到日志记录,我想将资源束附加到java.util.logging系统。然后,我可以在日志调用等中使用消息键。为此,我使用以下代码

ResourceBundle R = ResourceBundle.getBundle("klfr.sof.soFMessages");
Logger.getLogger("").setResourceBundle(R);

但这会引发以下错误

Exception in thread "main" java.lang.IllegalArgumentException: resource bundle must have a name
        at java.logging/java.util.logging.Logger.setResourceBundle(Logger.java:2320)
        at <line with setResourceBundle()>

这对我来说似乎很奇怪。异常提到的“名称”是资源束的基本名称,由getBaseBundleName()检索。 JavaDoc指出:

返回此包的基本名称(如果已知),或者返回null(如果未知)。如果不为null,则这是加载资源包时传递给ResourceBundle.getBundle(...)方法的baseName参数的值。

正如我所说,我确实使用getBundle成功加载了该资源包。我确实提供了基本名称。现在,基本名称已消失。加载RB后,我自己打了getBaseBundleName(),它为空。

因为我不敢相信,所以我深入研究了加载PropertyResourceBundle的Java源代码包括调试上述行并深入到库调用堆栈中,并跟踪创建的bundle对象。我发现name返回的getBaseBundleName()属性从未在我的情况下运行的任何代码属性文件,小型父链,模块类加载器和类似的认值)设置。

那么我在做什么错了?我的代码或Java本身有问题吗? java --version指出:

openjdk 14.0.1 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7)
OpenJDK 64-Bit Server VM (build 14.0.1+7,mixed mode,sharing)

请注意:根记录器似乎是带有空字符串名称的记录器(不是getGlobal()东西)。它在所有其他方面(例如日志处理程序,日志记录级别等)都用于“ root”用途,因此我从未质疑过。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)