[英]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.