У меня есть апплет, который помогает пользователям загружать фотографии в наш сервис. Файл апплета jar
содержит несколько .properties
файлов:
>> jar -tf applet.jar | grep prop
res/messages.properties
res/messages_ca.properties
res/messages_es.properties
...
Они загружаются во время инициализации апплета.
messages = ResourceBundle.getBundle("res.messages");
Однако этот вызов генерирует от 4 до 5 запросов к серверу, ищущему файлы, которых нет в файле jar
, а затем возвращается к файлу .properties
, включенному в .jar
.
Из журнала ошибок сервера:
[error] File does not exist: /photos/res/messages.class
[error] File does not exist: /photos/res/messages_en.class
[error] File does not exist: /photos/res/messages_en.properties
[error] File does not exist: /photos/res/messages_en_US.class
[error] File does not exist: /photos/res/messages_en_US.properties
Документация для ResourceManager.getBundle объясняет, что это так:
Затем getBundle перебирает имена подходящих пакетов, чтобы найти первое, для которого он может создать экземпляр фактического пакета ресурсов. Для каждого имени набора кандидатов он пытается создать пакет ресурсов:
Сначала он пытается загрузить класс, используя имя пакета-кандидата. Если такой класс может быть найден и загружен с использованием указанного загрузчика классов, совместим по присваиванию с ResourceBundle, доступен из ResourceBundle и может быть создан, getBundle создает новый экземпляр этого класса и использует его в качестве результирующего пакета ресурсов.
В противном случае getBundle пытается найти файл ресурса свойства. Он генерирует путь из имени пакета кандидата, заменяя все "." символы с "/" и добавлением строки ".properties". Он пытается найти «ресурс» с этим именем, используя ClassLoader.getResource.
Я уверен, что для этого есть веские причины, но в моем случае мне кажется расточительным, что должно быть пять неудачных запросов на файлы, о которых известно, что они не существуют на сервере.
Есть ли способ научить апплет искать эти файлы только в файле .jar
?
Примечание: я не программист на Java, поэтому, если есть лучший способ загрузить свойства, чем ResourceManager.getBundle
, пожалуйста, сообщите мне.