我正在努力在企业级应用程序中重构大量代码。
我想采取的第一步是本地化日志消息,所以我决定使用我在阅读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
并将文件放入其中来解决此问题。
答案 0 :(得分:3)
它失败的原因只是LocalStrings.properties文件不在你的war文件中。在Maven项目中,资源应该在src/main/resources
之下。不是src/main/java
。 Maven将完全忽略src/main/java
下的资源,因此他们根本不会在构建的Web应用程序中,因此无法在运行时使用。