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

从命名模块加载ResourceBundle

如何解决从命名模块加载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 举报,一经查实,本站将立刻删除。