spring maven profile - установить файл свойств на основе профиля компиляции

Я бы создал несколько профилей компиляции, подобных этим:

  • имя профиля: dev
  • имя профиля: test
  • имя профиля: производство

В src / main / resources у меня есть 3 папки:

  • dev / file.properties
  • test / file.properties
  • производство / file.properties

Каждый файл содержит разные значения для этих свойств:

- my.prop.one
- my.prop.two
- my.prop.three

После этого я бы установил в классах Spring что-то вроде этого:

@Configuration
@PropertySource("file:${profile_name}/file.properties")
public class MyConfig{

}

Как я могу сделать?


person michele    schedule 05.02.2018    source источник
comment
Использование переменной, которая зависит от вашей среды сборки, в производственном коде не является чистым решением. В чем разница между dev тестами и test тестами? Если вы можете уменьшить это число до test и production, вы можете поместить один file.properties в /src/main/resources и один в /src/test/resources, и Maven автоматически обработает их упаковку.   -  person Gerold Broser    schedule 05.02.2018
comment
Нет, у меня 3 среды. Как мне сделать =   -  person michele    schedule 06.02.2018
comment
Три file.properties просто различаются значениями конфигурации в одинаковых строках конфигурации или они тоже содержат разные строки конфигурации?   -  person Gerold Broser    schedule 06.02.2018
comment
Они содержат только разные значения свойств.   -  person michele    schedule 06.02.2018
comment
Отлично. Так легче. Смотрите мой ответ.   -  person Gerold Broser    schedule 06.02.2018
comment
Привет! вы нашли решение этого?   -  person superigno    schedule 11.12.2019


Ответы (1)


См. Плагин / фильтрация ресурсов Apache Maven и Maven: полное руководство - 9.3. Фильтрация ресурсов. (Фильтрация - плохая репутация, IMHO, поскольку фильтр обычно что-то отфильтровывает out, в то время как мы выполняем здесь интерполяцию строк. Но так оно и есть .)

Создайте одну file.properties в src/main/resources, содержащую ${...} переменные для значений, которые должны изменяться в зависимости от вашей среды.

Объявите свойства по умолчанию (для dev) и активируйте фильтрацию ресурсов в вашем POM:

<project>
  ...
  <properties>
    <!-- dev environment properties, 
         for test and prod environment properties see <profiles> below -->
    <name>dev-value</name>
    ...
  </properties>

  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
  </build>
  ...

Объявите два профиля с соответствующими свойствами в вашем POM:

  ...  
  <profiles>
    <profile>
      <id>test</id>
      <properties>
        <name>test-value</name>
        ...
      </properties>
    </profile>

    <profile>
      <id>prod</id>
      <properties>
        <name>prod-value</name>
        ...
      </properties>
    </profile>

  </profiles>
  ...

Используйте в своем коде только:

@PropertySource("file:file.properties")

Активируйте профили с помощью:

mvn ... -P test ...

or

mvn ... -P prod ...
person Gerold Broser    schedule 06.02.2018
comment
Значения свойств этого решения жестко запрограммированы в pom? Я не уверен, что понял. - person michele; 06.02.2018
comment
@michele Вы смотрели пример во второй ссылке, которую я предоставил? Это в основном описывает то, что вы ищете: Если вам нужно использовать другой [x] в разработке и другой [x] в производстве. И это делается так же, как я описал для ваше требование здесь. - person Gerold Broser; 06.02.2018
comment
@michele Hardcoded - неправильное слово здесь. Значения должны быть определены где-то в конце. А теперь подумайте, что лучше, более чистое решение: наличие трех файлов, которые отличаются только значениями конфигурации (помните DRY), которые все содержат жестко запрограммированные значения и зависимость времени сборки в производственном коде, которую мы пока не знаем, как решить или имея только один файл, который динамически обновляется значениями, из которых они принадлежат: конфигурация сборки (заголовок вашего вопроса содержит на основе профиля компиляции). - person Gerold Broser; 06.02.2018