2013-08-17 98 views
0

我在尝试将资源加载到我的应用程序中的包中时遇到了严重的麻烦。我已经呆了好几个小时了,我真的不知道自己做错了什么。类路径中资源的MissingResourceException

我有一个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")); 

在当服务器启动时,我总是得到缺少的资源例外之初:

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文件中,因此可以即时修改文件,所以我希望可以从类路径中执行此操作。

回答

0

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

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

(Jar文件被视为像文件夹,你可以看到上面)。

要明确 - ResourceBundle.getBundle(“记录”)调用会做的东西相当于这样的内部:

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

,当它这样做,它会寻找这条道路(“logging_en.properties”)放在类路径的文件夹中 - 这意味着它将查看/ data/dev/app/server,然后在/data/dev/app/common/lib/common.jar文件中它的解压缩内容的缓存)等等。 (有更多的可插拔性,并不是所有的类装载机都必须与文件等相对应 - 但在一般情况下,以上是发生的情况。)

+0

就是这样。现在一切都运行得很好。我可以为自己错过这一点而自嘲。非常感谢! –