Как читать файлы внешних свойств в WebSphere?
Я разработал пример веб-приложения, которое будет считывать данные из файла внешних свойств. Файл свойств находится в исходной папке моей системы и не входит в WAR-файл.
Файл свойств доступен следующим образом:
Properties prop = new Properties();
//File f1 = new File("Property.properties");
prop.load(getClass().getClassLoader().getResourceAsStream("Property.properties"));
- Как получить доступ к этому файлу свойств извне внутри файла WAR?
- Какие изменения необходимо внести в код, чтобы прочитать его в файле WAR?
3 ответа
Я думаю, что наиболее универсальным подходом является определение простой записи среды, как описано в разделе EE.5.4 Записи простой среды спецификации Java™ Platform, Enterprise Edition (Java EE), версия 5.
Из раздела (стр. 68):
Простая запись среды - это параметр конфигурации, используемый для настройки бизнес-логики компонента приложения. Значения записи среды могут быть одного из следующих типов Java: String, Character, Byte, Short, Integer, Long, Boolean, Double и Float.
Вы также можете использовать фабрику соединений URL, как описано в разделе EE.5.6.1.4 Стандартные фабрики соединений диспетчера ресурсов Типы спецификации.
Поставщик компонентов приложения должен использовать тип фабрики соединений менеджера ресурсов java.net.URL для получения соединений URL.
Оба требуют определения ссылки на ресурс в дескрипторе развертывания. WEB-INF/web.xml
вашего веб-приложения, чтобы вы могли ввести значение с помощью @Resource
или используйте JNDI API с java:comp/env
в качестве точки входа.
Преимущество заключается в том, что вы можете изменять конфигурацию своего веб-приложения без необходимости перекомпиляции кода, а также изменять его с помощью инструментов администрирования сервера приложений, к которым привыкли ваши администраторы.
В web.xml
Вы определяете ссылку на ресурс.
<resource-ref>
<res-ref-name>propertiesURL</res-ref-name>
<res-type>java.net.URL</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
<res-ref-name>propertiesPath</res-ref-name>
<res-type>java.lang.String</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
Затем в вашем коде вы используете следующее для доступа к значениям:
@Resource
String propertiesPath;
@Resource
URL propertiesURL;
При этом вы выполнили требования Java EE и можете использовать propertiesPath
или же propertiesURL
как если бы они были переданы в качестве входных параметров для ваших методов.
Теперь пришло время оправдать ожидания WebSphere Application Server.
Вы определили логические имена, которые должны быть сопоставлены с их административными именами (о которых сервер приложений знает и может предоставить приложению).
В WebSphere Application Server вы используете дескриптор WebSphere Binding WEB-INF/ibm-web-bnd.xml
со следующей конфигурацией:
<?xml version="1.0" encoding="UTF-8"?>
<web-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_1.xsd"
version="1.1">
<virtual-host name="default_host" />
<resource-ref name="propertyURL" binding-name="propertyURL" />
<resource-ref name="propertyURL" binding-name="propertyURL" />
</web-bnd>
Когда приложение развернуто, WAS позволяет сопоставить эти сопоставления с его администрируемыми ресурсами. Используйте консоль ISC для определения значений записей среды и сопоставления их с приложением.
Это стало проще с WebSphere Liberty Profile. Я описал механизм, предложенный WLP, в своей статье " Использование @Resource для доступа к JNDI в WebSphere AS 8.5 Liberty Profile".
У вас есть три варианта:
настройте Websphere для включения каталога, который содержит файл свойств в пути к классам. Не знаю, как это сделать, но я уверен, что это возможно, так как наше приложение делает то же самое
включите файл свойств в архив войны. Вы, вероятно, не хотите этого делать.
вместо этого, используя загрузчик классов для загрузки файла свойств, используйте файл api с абсолютным путем. Я не совсем уверен, что WAS допускает это, но в любом случае это плохая идея, потому что это делает ваше приложение очень зависимым от вещей, о которых оно действительно не должно заботиться, таких как путь установки вашего приложения.
У WebSphere есть две папки на пути к классам, из которых можно загрузить свойства:
Корпоративные приложения> myear > Управление модулями> myjar.jar > Средство просмотра загрузчика классов 4 - расширение - com.ibm.ws.bootstrap.ExtClassLoader
Файл:/projekte/IBM/WebSphere/AppServer-8.5/classes/
Файл:/projekte/IBM/WebSphere/AppServer-8.5/lib/