微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从属性文件加载的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 举报,一经查实,本站将立刻删除。