OpenLiberty не может внедрить переменную окружения

Я пытаюсь внедрить свойство, определенное в server.env.

 @Inject
 @ConfigProperty(name = "property")
 private String serverProperty;

содержание server.env

property=server-env-property

Я добавил его внутрь pom.xml

<serverEnv>src/main/liberty/config/server.env</serverEnv>

Читается во время liberty-maven-plugin:2.2:package-server

 CWWKM2144I: Update server configuration file server.env from /Users/abalaniuc/code/config/src/main/liberty/config/server.env.

Однако, когда приложение выполняется, я получил эту ошибку:

 The property property was not found in the configuration.

Трассировки стека:

[ERROR   ] CWMCG5003E: The [BackedAnnotatedField] @Inject @ConfigProperty private com.microprofile.study.config.config.ConfigTestController.serverProperty InjectionPoint dependency was not resolved. Error: java.util.NoSuchElementException: CWMCG0015E: The property property was not found in the configuration.
        at com.ibm.ws.microprofile.config.impl.AbstractConfig.getValue(AbstractConfig.java:175)
        at [internal classes]

Явно чего-то не хватает, но не могу понять что именно. Не могли бы вы мне помочь?

Как было предложено в ответах ниже, я удалил . из имени свойства, но все равно получил тот же результат.

Конфигурация Liberty-плагина:

<plugin>
  <groupId>net.wasdev.wlp.maven.plugins</groupId>
  <artifactId>liberty-maven-plugin</artifactId>
  <version>${openliberty.maven.version}</version>
  <executions>
    <execution>
      <id>package-server</id>
      <phase>package</phase>
      <goals>
        <goal>create-server</goal>
        <goal>install-apps</goal>
        <goal>package-server</goal>
      </goals>
      <configuration>
        <outputDirectory>target/wlp-package</outputDirectory>
      </configuration>
    </execution>
  </executions>
  <configuration>
    <assemblyArtifact>
      <groupId>io.openliberty</groupId>
      <artifactId>openliberty-runtime</artifactId>
      <version>${openliberty.version}</version>
      <type>zip</type>
    </assemblyArtifact>
    <configFile>src/main/liberty/config/server.xml</configFile>
    <serverEnv>src/main/liberty/config/server.env</serverEnv>
    <bootstrapPropertiesFile>src/main/liberty/config/bootstrap.properties</bootstrapPropertiesFile>
    <appArchive>${project.build.directory}/${final.name}.war</appArchive>
    <packageFile>${project.build.directory}/${final.name}.jar</packageFile>
    <include>runnable</include>
    <serverName>${final.name}</serverName>
    <installAppPackages>project</installAppPackages>
  </configuration>
</plugin>

Чтобы запустить приложение, я делаю:

mvn clean package

java -jar target/config.jar

person Anton Balaniuc    schedule 23.09.2019    source источник
comment
Можете ли вы опубликовать свой пример приложения на GitHub? Интересно, считываются ли переменные env во время упаковки сервера, но не во время выполнения сервера.   -  person Andy McCright    schedule 23.09.2019
comment
@AndyMcCright, пожалуйста, найдите репозиторий здесь github.com/anton-balaniuc/config   -  person Anton Balaniuc    schedule 24.09.2019


Ответы (2)


Переменные среды обычно не допускают периодов - см. этот пост для более подробной информации. Но вы можете использовать символы подчеркивания в переменных окружения.

Предполагается, что MicroProfile Config преобразует символы подчеркивания из env vars в точки, а также переопределяет чувствительность к регистру. Сопоставление обсуждается здесь.

Итак, я предлагаю попробовать изменить server.property=server-env-property в server.env на server_property=server-env-property или SERVER_PROPERTY=server-env-property, чтобы посмотреть, работает ли это.

ОБНОВЛЕНИЕ: Основная проблема заключается в том, как определяются переменные env для среды, в которой работает сервер Liberty.

При использовании команды server для запуска/запуска сервера она считывает серверный файл server.env и устанавливает эти переменные среды для сервера (в дополнение к любым переменным среды, уже определенным в оболочке).

При использовании подхода java -jar server.jar он не будет читать файл server.env, но будет читать переменные среды, определенные в оболочке. При использовании этого подхода пользователи должны либо явно установить переменные среды (например, export MY_VAR=MyValue), либо должны использовать команды оболочки для чтения в файле server.env (например, . server.env, env X=Y и т. д.).

Надеюсь это поможет!

person Andy McCright    schedule 23.09.2019
comment
К сожалению, это не решает проблему. Все еще получаю ту же ошибку, даже если я использую server_property=server-env-property или просто server=server-env-property. Я предполагаю, что файл не ожидается во время поиска свойства - person Anton Balaniuc; 23.09.2019
comment
Вы также обновили свою аннотацию @ConfigProperty с обновленным именем свойства? Кроме того, в качестве проверки работоспособности вы можете попробовать распечатать результат System.getenv("server_property"), чтобы увидеть, связана ли эта проблема с server.env, устанавливающим переменную, или с проблемой поиска/чтения свойства MP Config. - person Andy Guibert; 23.09.2019
comment
@AndyGuibert, поэтому System.getenv("property") возвращает null. Я изменил имя с server.property на property как в server.env, так и в @ConfigProperty(name = "property"). - person Anton Balaniuc; 23.09.2019
comment
интересно, а где находится ваш файл server.env и какой инструмент используется для запуска сервера Liberty? - person Andy Guibert; 23.09.2019
comment
Посмотрите на target/liberty/wlp/user/servers/<myServer>/server.env (по умолчанию: target/liberty/wlp/user/servers/defaultServer/server.env). Что там? - person Scott Kurz; 23.09.2019
comment
Вы также можете просто поделиться своей полной конфигурацией liberty-maven-plugin.., в том числе указать, наследуете ли вы от одного из родительских POM. Если ваша проблема в конечном итоге связана с конфигурацией плагина, вы можете даже рассмотреть возможность перехода на недавно выпущенный уровень v3.0.1, в котором был сделан ряд улучшений и улучшений, вместо того, чтобы разбираться на текущем уровне. - person Scott Kurz; 23.09.2019
comment
@ScottKurz, вы можете просмотреть весь pom.xml здесь github.com/ anton-balaniuc/config/blob/master/pom.xml, у меня нет родительского pom. liberty-maven-plugin используется напрямую. - person Anton Balaniuc; 24.09.2019
comment
У меня это сработало. Я сделал: mvn clean install liberty:start-server затем нажал конечную точку localhost:8181/config /data/config/server и показывает: Config value as Injected by CDI server-env-property. - person Scott Kurz; 24.09.2019
comment
@ScottKurz, это действительно работает, если вы используете mvn clean install liberty:start-server, однако я использовал другой подход, предложенный https://start.microprofile.io/, когда вы создаете проект, файл readme.txt содержит следующие инструкции mvn clean package и java -jar target/config.jar - person Anton Balaniuc; 25.09.2019
comment
@ScottKurz, поэтому, если я использую mvn clean package and java -jar target/config.jar, похоже, что server.env не используется/не найден. - person Anton Balaniuc; 25.09.2019
comment
@AntonBalaniuc - ах! Это ожидаемо. Подход java -jar не читает файл server.env. Вместо этого он читает переменные среды вашей оболочки. Я запустил ваш тестовый пример и увидел ошибку. Затем я экспортировал свойство=someProp на терминал, и это удалось. Можете ли вы попробовать: export property=someProp а затем запустить java -jar config.jar ? - person Andy McCright; 25.09.2019
comment
@AndyMcCright, большое спасибо, все работает. ` Подход java -jar не читает файл server.env. Вместо этого он читает переменные среды вашей оболочки. Эта часть где-нибудь задокументирована? - person Anton Balaniuc; 30.09.2019
comment
@AndyMcCright, не могли бы вы также обновить свой ответ этой информацией, чтобы я мог ее принять? - person Anton Balaniuc; 30.09.2019

Точка не является допустимым символом в переменной среды. Если вы укажете это в server.env, это должно работать:

server_property=server-env-property

Спецификация конфигурации MicroProfile автоматически преобразует точку в аннотации ConfigProperty в _ для поиска.

person Alasdair    schedule 23.09.2019
comment
К сожалению, это не решает проблему. Все еще получаю ту же ошибку, даже если я использую server_property=server-env-property или просто server=server-env-property. Я предполагаю, что файл не ожидается во время поиска свойства - person Anton Balaniuc; 23.09.2019