如何解决从命名模块加载ResourceBundle
让我们假设模块A(提供者)包含messages.properties
,并且我们想从模块B中将其作为ResourceBundle加载。Javadoc确实建议采用以下方法。
提供商模块:
module provider {
exports provider;
exports provider.spi;
provides MessagesProvider with MessagesProviderImpl;
}
package provider.spi;
public interface MessagesProvider extends ResourceBundleProvider {}
package provider;
public class MessagesProviderImpl extends AbstractResourceBundleProvider implements MessagesProvider {
public MessagesProviderImpl() {
super("java.properties");
}
protected String toBundleName(String baseName,Locale locale) {
return super.toBundleName(baseName.toLowerCase(),locale);
}
}
消费模块:
module consumer {
requires provider;
uses MessagesProvider;
}
ResourceBundle bundle = ResourceBundle.getBundle("provider.Messages");
这是过度设计,但更重要的是,这种设计与插件系统不兼容。如果您有多个插件(提供者),则显然它们只能共享相同的ResourceBundleProvider接口。但是当前的ResourceBundle实现仅加载first中的found implementations。
我想知道这样设计的原因是什么,如果可以轻松地做到这样:
public class FooClassInProviderModule {
public ResourceBundle getBundle(Locale locale) {
return ResourceBundle.getBundle(LOCAL_PATH,locale,FooClassInProviderModule.class.getModule());
}
}
...,当从使用者模块调用时,它可以工作。而且它也可以用于JRT图像。为什么将ResourceBundleProvider弄得一团糟?
更新:
好的,我想我明白了。它不是设计,javadocs措词不正确。
如果资源包部署在与 调用方模块,这些资源束需要从服务加载 ResourceBundleProvider的提供者。
相反,它应该说“如果资源束被部署在与调用方模块分开的命名模块中,并且您不知道确切的位置,则应该依赖ServiceLoader接口的ResourceBundleProvider”。
如果您知道确切的模块,则不需要ResourceBundleProvider。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。