ResourceBundle 无法从 webapp 中的包加载属性文件

ResourceBundle is unable to load properties file from package inside a webapp

我正在重构企业级应用程序中的大量代码。

我想采取的第一步是本地化日志消息,所以我决定使用我在阅读 Apache Tomcat 源代码时看到的 StringManager

基本思路是在包中声明一个名为LocalString.properties的文件,并在其中定义日志消息。所以在某种程度上,这 将字符串本地化 仅在该包的范围内,因此它看起来像:

Application
`----src
|    `----main
|         `----java
|              `----package
|                   `----BusinessAction.java
|                   `----LocalStrings.properties
`----pom.xml

并且此 StringManager 的一个对象被实例化为:

private static final StringManager sm = StringManager.getManager("package");

这是 StringManager class.

的构造函数
/**
 * Creates a new StringManager for a given package. This is a
 * private method and all access to it is arbitrated by the
 * static getManager method call so that only one StringManager
 * per package will be created.
 *
 * @param packageName Name of package to create StringManager for.
 */
private StringManager(String packageName) {
    String bundleName = packageName + ".LocalStrings";
    try {
        bundle = ResourceBundle.getBundle(bundleName, Locale.getDefault());
    } catch( MissingResourceException ex ) {
        ClassLoader cl = Thread.currentThread().getContextClassLoader();
        if( cl != null ) {
            try {
                bundle = ResourceBundle.getBundle(
                        bundleName, Locale.getDefault(), cl);
            } catch(MissingResourceException ex2) {
                // Ignore
            }
        }
    }
    // Get the actual locale, which may be different from the requested one
    if (bundle != null) {
        locale = bundle.getLocale();
    }
}

这在独立应用程序中使用时绝对没问题,但在 Web 应用程序中使用时会导致问题。

我不明白为什么第一手包加载失败,但在 catch 块中,我可以肯定地说这是因为 classloader 是 [=17= 的一个实例].

我在这里犯了什么错误?另外,加载这个 属性 文件的好方法是什么?


编辑

这里的问题与 Maven 构建有关。 Maven 处理 src/main/resources 中的所有资源并忽略 src/main/java 中的资源。所以最后,编译后的应用程序没有 LocalStrins.properties 文件。

通过在 src/main/resources 中创建 package 并将文件放在那里解决了这个问题。

它失败的原因仅仅是 LocalStrings.properties 文件不在您的 war 文件中。在 Maven 项目中,资源应该在 src/main/resources 以下。不是 src/main/java。 Maven 将简单地忽略 src/main/java 下的资源,因此它们根本不会出现在构建的 webapp 中,因此在运行时将不可用。