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

113

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

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

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

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

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

Питер
источник

Ответы:

153

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

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

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

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

Шонф
источник
При каких обстоятельствах это полезно или лучше, чем явное упоминание самого профиля? т.е. вместо того, чтобы передавать -DmyFlag, я могу правильно выполнить -PmyDefaultProfile? Есть ли какая-то польза от управления им с помощью флага, который мне не хватает?
Chetya
1
Поскольку профиль активен автоматически , если флаг не существует. Профиль firstProfileотключен, только если вы укажете -DskipFirstProfile(например mvn verify -DskipFirstProfile).
seanf
25

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

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

И это разрешено как 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)

Шон Патрик Флойд
источник
Альтернативой может быть наследование профилей или декораторы профилей, позволяющие повторно использовать базовые конфигурации.
Crowne
@crowne определенно да. Почему бы не предложить это как запрос функции?
Шон Патрик Флойд
Это вроде как связано ... Одна вещь, которую мне нравится делать, это добавлять все модули в активный по умолчанию профиль, потому что я думал, что нет способа удалить модуль из выполнения. В 3.2.1 они добавили это, как показано здесь . Я оставляю этот комментарий на случай, если кто-то здесь споткнется и использует модули по той же причине, что и я.
Captain Man
10

Это древний вопрос, но похоже, что проблему можно решить, используя 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все еще активно. Ура!

inanutshellus
источник
4

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

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

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

Ассем
источник
7
Это не совсем так. Активация профилей вручную с помощью -Pтолько деактивирует <activeByDefault>профили. Профили, активированные <activeProfiles>в settings.xmlили любым другим типом, <activation>остаются активными, если явно не деактивированы.
Сэм Хейнс
4

Профили - хороший способ навести порядок в POM. Особенно, если вы используете несколько запусков одного и того же плагина для разных целей.

Использование файлов:

<profile>
    <id>alwaysActive</id>
    <activation>
         <file><exists>.</exists></file>
    </activation>
    ...
</profile>

Это всегда будет так (если только кто-то не удалит каталог во время загрузки Maven :). Протестировано с Maven 3.6.0.

Это также может быть хорошим способом различать типы проектов. Например, мой проект всегда module.jsonприсутствует.

Использование расширения для активации профиля

Есть несколько расширений Maven для активации профиля. Один из них здесь:
https://github.com/OndraZizka/el-profile-activator-extension

Ондра Жижка
источник
1
небольшая поправка вроде бы<file><exists>.</exists></file>
revau.lt 01
-1

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

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

Даниэль Штольц
источник
Это не отвечает на вопрос - OP прямо заявляет, что профиль должен быть «всегда активен, если он явно не деактивирован». Предположительно, иногда необходимо явно отключить его, что не позволяет этот ответ.
sleske