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"));

В самом начале при запуске сервера неизменно получаю исключение 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 и добавил все три в свой путь к классам. Все та же проблема. Я знаю, что делаю что-то глупое или упускаю что-то очевидное, но я действительно в растерянности. Я бы предпочел не объединять файл в свою банку, чтобы его можно было изменить на лету, поэтому я надеюсь, что это можно сделать из пути к классам.


person Curtis Snowden    schedule 17.08.2013    source источник


Ответы (1)


Для отдельных файлов путь к классам должен содержать папку, в которой находятся файлы, а не путь к самому файлу. Измените свой путь к классам, чтобы он читался так:

/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 (в нем есть кеш с разархивированным содержимым) и так далее. (Существует больше подключаемых модулей, и не все загрузчики классов должны соответствовать файлам и т. д., но в общем случае это то, что происходит выше.)

person Brad Peabody    schedule 17.08.2013
comment
Это было именно так. Сейчас все работает нормально. Я мог бы ударить себя за то, что пропустил это. Большое спасибо! - person Curtis Snowden; 17.08.2013