Classpath中的资源的MissingResourceException

时间:2013-08-17 02:05:07

标签: java log4j classpath resourcebundle

我在尝试将资源加载到应用程序中的捆绑包时遇到了严重问题。我已经在这几个小时了,我真的不知道我做错了什么。

我有一个Java应用程序,我正在尝试将国际化应用于我的日志记录。 Eclipse中的一切都运行良好,只有当我尝试将已编译的jar部署到测试环境中时才能找到属性文件。我的属性文件名为logging_en.properties。我已经验证它是在文件系统上(顺便说一下,Linux)。当我启动我的应用程序时,我执行以下命令:

$JAVA_HOME/bin/java -verbose:gc -Xloggc:/var/tmp/app_gc.log -Xms1000m -Xms1000m  -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:NewRatio=3  -classpath $CLASSPATH -Djava.rmi.server.codebase=file:///data/dev/app/common/ext/dirmi-1.1.1.jar -Djava.awt.headless=true -Dcom.sun.management.jmxremote.port=xxx -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false $JAVA_SECURITY $IMPORT_PROPERTIES $APP_PROPERTIES app.serverimpl.ServerStarter

我的CLASSPATH变量是:

/data/dev/app/server/logging_en.properties:/data/dev/app/common/lib/common.jar:/data/dev/app/common/ext/dirmi-1.1.1.jar:/data/dev/app/common/ext/log4j-1.2.17.jar:/data/dev/app/common/ext/cojen-2.2.3.jar:/data/dev/app/common/lib/server.jar

属性文件位于我的类路径中。在代码本身中,我运行的确切行是:

LogManager.getLogger("server").setResourceBundle(java.util.ResourceBundle.getBundle("logging"));

在服务器启动的最初阶段,我总是得到Missing Resource异常:

Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name logging, locale en_US

为了安全起见,我已经将文件复制到logging.properties和logging_en_US.properties,并将所有三个文件添加到我的类路径中。仍然是同一个问题。我知道我做的事情很愚蠢,或者缺少一些明显的东西,但我真的很茫然。我不想将文件捆绑到我的jar中,因此可以动态修改,所以我希望可以从类路径中执行此操作。

1 个答案:

答案 0 :(得分:0)

对于单个文件,类路径需要包含文件所在的文件夹,而不是实际文件本身的路径。将类路径更改为:

/data/dev/app/server/:/data/dev/app/common/lib/common.jar:...

(Jar文件被视为文件夹,如上所示)。

要清楚 - ResourceBundle.getBundle(“logging”)调用将在内部完成相同的操作:

ClassLoader.getSystemClassLoader().getResource("logging_en.properties")

当它这样做时,它将在类路径的文件夹中查找该路径(“logging_en.properties”) - 这意味着它将在/ data / dev / app / server中查找然后在/ data /中dev / app / common / lib / common.jar文件(它有一个解压缩内容的缓存),依此类推。 (涉及更多可插拔性,并非所有类加载器都必须与文件等对应 - 但在通常情况下,上述情况确实发生。)