从命名模块加载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 (将#修改为@)