簡體   English   中英

ResourceBundle無法從Webapp內的程序包加載屬性文件

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

我正在重構企業級應用程序中的大量代碼。

我要采取的第一步是本地化日志消息,因此我決定使用在閱讀Apache Tomcat的源代碼時看到的StringManager

基本思想是在包中聲明一個名為LocalString.properties的文件,並在其中定義日志消息。 因此,在某種程度上,這會將Strings僅本地化為該包的范圍,因此它看起來像:

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塊中,我可以肯定地說這是因為classloader是WebappClassloader的實例。

我在這里犯了什么錯誤? 另外,加載該屬性文件的好方法是什么?


編輯

這里的問題是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中,因此在運行時將不可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM