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 中,因此在运行时将不可用。
我正在重构企业级应用程序中的大量代码。
我想采取的第一步是本地化日志消息,所以我决定使用我在阅读 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 中,因此在运行时将不可用。