Возможно ли в Maven иметь по умолчанию более одного активного профиля? - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть следующие настройки профиля в Maven:

<profiles>
    <profile>
        <id>prod</id>
        <properties>
            <environment>prod</environment>
            <serverAddress>https://example.com/v1</serverAddress>
            <pubNubSubscribeKey>blah-blah</pubNubSubscribeKey>
            <sentryDsn>https://username:password@sentry.io/id</sentryDsn>
        </properties>
    </profile>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <environment>dev</environment>
            <serverAddress>http://localhost:8080/v1</serverAddress>
            <pubNubSubscribeKey>blah blah</pubNubSubscribeKey>
            <sentryDsn/>
        </properties>
    </profile>
    <profile>
        <id>win32</id>
        <activation>
            <os>
                <family>Windows</family>
                <arch>x86</arch>
            </os>
        </activation>
    </profile>
    <profile>
        <id>win64</id>
        <activation>
            <os>
                <family>Windows</family>
                <arch>amd64</arch>
            </os>
        </activation>
    </profile>
</profiles>

Существует четыре профиля, но одна из двух архитектур и одна из двух prod / dev должны быть активны одновременно. Профиль dev по умолчанию настроен на активацию, когда win64 становится активным из-за критериев активации, профиль dev становится неактивным.

Есть ли способ сохранить профиль dev активным, если профиль prod не станет активным?

По сути, я хочу такую ​​логику:

------------------------
|      | win32 | win64 |
------------------------
| dev  |       |   X   |
------------------------
| prod |       |       |
------------------------

У меня есть application.properties шаблон в src/main/resources, который выглядит примерно так:

version=${version}
environment=${environment}
server.address=${serverAddress}
pubnub.keys.subscribe=${pubNubSubscribeKey}
sentry.dsn=${sentryDsn}

и затем с использованием фильтра:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>application.properties</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
</resources>

Я заполнил его правильным значением для prod или dev. Если этого не происходит, приложение не запускается. Я не могу передать на своем компьютере setting.xml или переменную среды, чтобы dev был активным, потому что это означает, что он не будет активным на других компьютерах, и это будет очень запутанным.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Профили также могут быть активированы на основе значения системных свойств. Вы можете иметь что-то вроде

<profiles>
  <profile>
    <id>win32</id>
    <activation>
      <property>
        <name>arch</name>
        <value>win32</value>
      </property>
    </activation>
    ...
  </profile>
  <profile>
    <id>dev</id>
    <activation>
      <property>
        <name>environment</name>
        <value>dev</value>
      </property>
    </activation>
    ...
  </profile>
  <profile>
    <id>win64</id>
    <activation>
      <property>
        <name>arch</name>
        <value>win64</value>
      </property>
    </activation>
    ...
  </profile>
  <profile>
    <id>prod</id>
    <activation>
      <property>
        <name>environment</name>
        <value>prod</value>
      </property>
    </activation>
    ...
  </profile>
</profiles>

теперь, если вы установите два системных свойства, таких как arch = win64 и environment = dev, у вас должно быть 2 активных профиля

0 голосов
/ 24 апреля 2018

activeByDefault - это запасной вариант, который активируется, если другой профиль не активирован.

Чтобы активировать более одного профиля, вы можете либо добавить их в раздел activeProfiles вашего settings.xml, что имеет смысл для локальной разработки установить для профиля dev или prod для другого машины.

Вы можете запустить его с параметрами CLI, такими как опция -P или через System-Property-Activation и -Dpropname=value. Опция системного свойства также имеет отрицательную версию, которая запускает профиль, если свойство либо не установлено, либо не имеет определенных значений. Это вполне может быть использовано для реализации функции «или-или-переключаться», при этом по умолчанию срабатывает, если свойство не установлено:

<profile>
    <id>dev</id>
    <activation>
       <property>
           <name>!prod</name> <!-- deactivated if system property prod is set, otherwise activated -->
       </property>
    </activation>
</profile>
<profile>
    <id>prod</id>
    <activation>
       <property>
           <name>prod</name> 
       </property>
    </activation>
</profile>

Деактивировать разработку / активировать продукт с помощью

mvn ... -Dprod=true

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

Но есть небольшой обходной путь, который активирует профиль по условию, при этом условие всегда выполняется, и это - использование активации файла и файла, который всегда существует, например, pom.xml или - если ваши poms расположены в другая позиция, . работает так же

<profile>
    <id>dev</id>
    <activation>
       <file>
           <exists>pom.xml</exists>
       </file>
    </activation>
</profile>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...