问题描述
让我们假设模块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 (将#修改为@)