2013-08-17 2 views
0

내 응용 프로그램에서 리소스를 번들에로드하는 중 심각한 문제가 발생했습니다. 나는 몇 시간 동안이 일을 해왔고, 내가 뭘 잘못하고 있는지 정말로 모른다.Classpath의 리소스에 대한 MissingResourceException

로깅에 국제화를 적용하려는 Java 응용 프로그램이 있습니다. 이클립스에서는 모든 것이 잘 작동한다. 컴파일 된 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 

특성 파일 내 클래스 경로에 있습니다. 코드 자체에서 나는 실행 정확한 라인은 다음과 같습니다

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

그냥 나 ', 안전을 위해 : 서버, 나는 변함없이 누락 된 자원 예외가 시작하는 처음에서

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

지금까지 파일을 logging.properties 및 logging_en_US.properties에 복사하고 세 클래스를 모두 클래스 경로에 추가했습니다. 여전히 같은 문제입니다. 나는 바보 같은 일을하고 있거나 뭔가 빠져있는 것을 압니다.하지만 저는 정말 실망합니다. 내 항아리에 파일을 번들하지 않으므로 비행 중에 수정할 수 있으므로 클래스 패스에서이 작업을 수행 할 수 있기를 바랍니다.

답변

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 파일에서 볼 수 있음을 의미합니다. 그것의 압축을 푼 내용의 캐시) 등등. (더 많은 pluggability가 관련되어 있고 모든 클래스 로더가 파일에 대응해야하는 것은 아닙니다. 그러나 일반적인 경우에 위와 같은 현상이 발생합니다.)

+0

정확하게 그랬습니다. 모든 것이 이제는 잘 돌아갑니다. 나는 그것을 놓치기 위해 나 자신을 때려 눕힐 수 있었다. 정말 고맙습니다! –