it-roy-ru.com

Как сохранить активные профили Maven, если они активны, даже если активирован другой профиль?

У меня есть профиль в моем файле pom.xml, который должен быть всегда активным, если он явно не деактивирован (-P! FirstProfile) . Я решил это с помощью флага activeByDefault:

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    ...
  </profile>
</profiles>

Теперь в том же файле pom.xml у меня определен второй профиль, он должен быть активным, только если профиль действительно активирован (-P secondProfile) . Поэтому поведение по умолчанию: firstProfile active, secondProfile неактивно . В некоторых случаях Другой момент, который я хотел бы активировать второй профиль в дополнение к первому профилю . Теперь проблема заключается в том, что если я сделаю это с "-P secondProfile", то firstProfile, к сожалению, деактивируется . Документация Maven заявляет это:

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

Есть ли возможность как-нибудь сохранить первый активный профиль всегда активным (не объявляя его в settings.xml)?

93
Peter

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

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <property>
        <name>!skipFirstProfile</name>
      </property>
    </activation>
    ...
  </profile>
</profiles>

После этого вы сможете деактивировать профиль с помощью -DskipFirstProfile Или -P !firstProfile, но в противном случае профиль будет активным.

См .: Maven: Полная справка, Активация профиля - Активация при отсутствии свойства

132
seanf

Хотелось бы, чтобы была такая возможность, я часто упускал ее. Единственная уместная проблема JIRA, которую я смог найти, это:

MNG-4917: профиль не активен, даже если для activeByDefault установлено значение true

И это было решено как Not A Problem.

Я перестал использовать activeByDefault, потому что этот подход «все или ничего» сделал его бесполезным для меня.


Единственный способ изменить это поведение - написать собственную замену для DefaultProfileSelector , зарегистрировать его как компонент сплетения с помощью @Component( role = ProfileSelector.class ) и поместить в ${MAVEN_HOME}/lib/ext (таким образом, он будет выбран в качестве селектора профиля по умолчанию). (Если вы используете Maven 3.0.2 или старше, вам также придется отредактировать ${MAVEN_HOME}/bin/m2.conf, чтобы загрузить lib/ext, прежде чем он загрузит lib)

21
Sean Patrick Floyd

Этот вопрос древний, но, похоже, проблему можно решить с помощью activeProfile, а не activeByDefault. Я на Maven 3.3.9, но решение может работать на более ранних версиях.

Просто перечислите ваш activeProfiles в вашем settings.xml, вот так:

<settings>
  <profiles>
    [...]
  </profiles>
  <activeProfiles>
    <activeProfile>my-awesome-profile</activeProfile>
  </activeProfiles>
</settings>

В my-awesome-profile у меня есть настройки, такие как URL базы данных и т.д., Поэтому они всегда применяются. Здесь я активирую второй профиль resolve-from-central:

$ mvn help:all-profiles -P resolve-from-central 
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-help-plugin:2.2:all-profiles (default-cli) @ standalone-pom ---
[INFO] Listing Profiles for Project: org.Apache.maven:standalone-pom:pom:1
  Profile Id: resolve-from-central (Active: true , Source: settings.xml)
  Profile Id: my-awesome-profile (Active: true , Source: settings.xml)
  Profile Id: resolve-from-internal (Active: false , Source: settings.xml)

Обратите внимание, что my-awesome-profile все еще активен. Ура!

3
inanutshellus

Вы можете просто перечислить все профили, которые вы хотите активировать в командной строке, следующим образом:

-P профиль-1, профиль-2

maven был спроектирован так, чтобы разрешить активацию нескольких профилей автоматически, однако если вы переопределите это с помощью -P, активируются только профили, перечисленные в параметре.

3
Assem

Вы не можете сохранить профиль по умолчанию активным, но вы можете взять содержимое этого профиля (в вашем примере ...) и просто переместить его в основной раздел pom.

То, что вы используете профили, не означает, что все, что вы делаете, должно быть в профиле.

0
Daniel Stolz