Я поддерживаю апплет, который помогает пользователям загружать фотографии на наш сервис. Файл апплет jar
имеет несколько .properties
файлов:Как предотвратить запросы на сервер при загрузке свойств, которые уже находятся в файле jar-файла апплета?
>> 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
, пожалуйста, дайте мне знать.
Какая у вас минимальная версия Java? – McDowell
1.4 и выше - это то, что нам нужно поддерживать. Ваш ответ зависит от этой информации? В любом случае, ответьте. Если ваше решение недействительно для более старых версий, все равно будет полезно, если только добавить в список причин, почему мы должны прекратить поддержку 1.4 :) –