ResourceBundle无法从webapp

时间:2016-11-21 14:28:11

标签: java maven resourcebundle

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

我想采取的第一步是本地化日志消息,所以我决定使用我在阅读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类的构造函数。

/**
 * 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块中,我可以肯定地说这是因为类加载器是WebappClassloader的实例。

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

修改

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

通过在package中创建src/main/resources并将文件放入其中来解决此问题。

1 个答案:

答案 0 :(得分:3)

它失败的原因只是LocalStrings.properties文件不在你的war文件中。在Maven项目中,资源应该在src/main/resources之下。不是src/main/java。 Maven将完全忽略src/main/java下的资源,因此他们根本不会在构建的Web应用程序中,因此无法在运行时使用。