Профиль WAS Liberty — чтение свойства с помощью ClassLoader.getSystemResourceAsStream

Мы переносим наше приложение с WAS 6.1 на Liberty. Наше приложение использует сторонние jar-файлы, которые считывают файлы свойств byInputStream is = ClassLoader.getSystemResource("myproperty.properties"). В WAS 6.1 мы установили путь к классам сервера для расположения myproperty.properties. Мы попробовали следующие подходы для установки пути к классам в Liberty, но ничего не работает.

Подход 1: Установите ниже в jvm.options (D:\ConfigFiles\DEV\ - путь, содержащий myproperty.properties)

-Djava.class.path=D:\\ConfigFiles\\DEV\\

Подход 2: установка загрузчика классов в server.xml,

<library id="config">
 <folder dir="${server.config.dir}/config/" includes="*.properties" scanInterval="5s"/>
</library>

<enterpriseApplication id="applicationEAR" location="application.ear" name="application">
 <classloader privateLibraryRef="config"/>
</enterpriseApplication>

Пожалуйста, дайте нам знать, есть ли другие способы переопределить/установить путь к классам в профиле Liberty?


person Bruno    schedule 06.07.2018    source источник
comment
Исправьте стороннюю библиотеку для использования метода getResourceAsStream() следующим образом: InputStream is = this.getClass().getClassLoader().getResourceAsStream("myproperty.properties");   -  person Gas    schedule 09.07.2018
comment
К сожалению, у нас нет доступа к стороннему исходному коду.   -  person Bruno    schedule 27.07.2018


Ответы (2)


Попробуйте установить это свойство в jvm.options (вместо -Djava.class.path=path/to/propertyDir):

-Xbootclasspath/a:path/to/propertyDir

Это добавит путь к каталогу свойств (содержащему ваш файл ресурсов) к пути к классу начальной загрузки JVM. Поскольку это добавление, оно также должно работать в Java 9+ (некоторые связанные параметры были удалены в Java 9).

Я подозреваю, что причина, по которой -Djava.class.path=... не работает, заключается в том, что JVM получает путь к классам из сценария сервера WLP, поэтому системное свойство по существу применяется слишком поздно при запуске сервера JVM.

Вы также можете поместить файлы свойств в каталог lib/ext вашей JVM, но я не проверял это. Подход -Xbootclasspath/a:path работает для меня на Mac — я предполагаю, что он также будет работать на Windows.

ХТХ, Энди

person Andy McCright    schedule 09.07.2018
comment
Это решило мою проблему. Файл свойств читается. Большое спасибо - person Bruno; 10.07.2018
comment
Добро пожаловать - рад слышать, что это работает для вас. Я проголосовал за ответ @Andy Guibert, потому что это, вероятно, лучшее долгосрочное решение, но этот ответ работает в случаях, когда вы не контролируете библиотеку, загружающую ресурс/класс/и т. д. - person Andy McCright; 10.07.2018
comment
Привет, Энди, просто хотел проверить, будет ли это работать и в Linux? - person Bruno; 27.07.2018
comment
@Бруно, да. он должен работать на всех платформах, но я тестировал его только на Mac с Oracle Java 8 JDK. - person Andy McCright; 28.07.2018

Если вашей конечной целью является загрузка файла свойств, более простым способом сделать это будет использование свойства bootstrap/env/system или <jndiEntry> в server.xml для сохранения местоположения файла свойств, а затем его загрузка. Например, используя переменную среды:

(в файле server.xml)

<server>
  <featureManager>
    <feature>jndi-1.0</feature>
    ...
  </featureManager>

  <jndiEntry jndiName="configDir" value="D:\\ConfigFiles\\Dev"/>    
</server>

Затем вы можете загрузить ресурс в свое приложение следующим образом:

@Resource(lookup = "configDir")
String configDir;

InputStream is = new FileInputStream(configDir + "/myproperty.properties");

Или, если вы всегда будете размещать файлы свойств конфигурации где-то под ${server.config.dir}, вы можете использовать встроенную переменную среды SERVER_CONFIG_DIR в Liberty:

String configDir = System.getenv("SERVER_CONFIG_DIR"); // equivalent to ${server.config.dir} in server.xml
InputStream is = new FileInputStream(configDir + "/myproperty.properties");

Что касается управления конфигурацией, ознакомьтесь с конфигурацией MicroProfile Config (например, <feature>microProfile-1.2</feature>), которая может оказаться полезной:
Настройка микросервисов с помощью Liberty

person Andy Guibert    schedule 08.07.2018
comment
Привет @Andy Guibert, спасибо за ответ. Мы не можем реализовать описанный выше подход, потому что фрагмент кода InputStream is = ClassLoader.getSystemResource("myproperty.properties") находится внутри стороннего jar-файла. Итак, есть ли способ переопределить путь к классам без изменения логики чтения. - person Bruno; 09.07.2018