Как читать файлы внешних свойств в WebSphere?

Я разработал пример веб-приложения, которое будет считывать данные из файла внешних свойств. Файл свойств находится в исходной папке моей системы и не входит в WAR-файл.

Файл свойств доступен следующим образом:

Properties prop = new Properties();
//File f1 = new File("Property.properties");
prop.load(getClass().getClassLoader().getResourceAsStream("Property.properties"));
  1. Как получить доступ к этому файлу свойств извне внутри файла WAR?
  2. Какие изменения необходимо внести в код, чтобы прочитать его в файле 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".

У вас есть три варианта:

  1. настройте Websphere для включения каталога, который содержит файл свойств в пути к классам. Не знаю, как это сделать, но я уверен, что это возможно, так как наше приложение делает то же самое

  2. включите файл свойств в архив войны. Вы, вероятно, не хотите этого делать.

  3. вместо этого, используя загрузчик классов для загрузки файла свойств, используйте файл 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/

Другие вопросы по тегам