2013-08-17 94 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

就是這樣。現在一切都運行得很好。我可以爲自己錯過這一點而自嘲。非常感謝! –