Як утримувати активні профілі MavenByDefault, навіть якщо інший профіль активується?


113

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

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

Тепер у тому ж pom.xml у мене визначений другий профіль, він повинен бути активним, лише якщо профіль дійсно активований (-P secondProfile). Таким чином, поведінка за замовчуванням: першийProfile активний, другийProfile неактивний. У якийсь інший момент я хотів би активувати другий профіль на додаток до першого. Тепер проблема полягає в тому, що якщо я це роблю з "-P secondProfile", першийProfile, на жаль, вимикається. У документації Maven зазначено:

... Цей профіль автоматично буде активним для всіх збірок, якщо інший профіль у тому ж POM не буде активований за допомогою одного з описаних раніше методів. Усі профілі, які за замовчуванням активні, автоматично деактивуються, коли в командному рядку або через його конфігурацію активації активовано профіль у POM. ...

Чи є якось можливість, як зберегти першийProfile завжди активним (без необхідності декларувати це в налаштуваннях.xml)?


Відповіді:


153

Один фокус - уникати activeByDefault, а замість цього активувати профіль відсутністю властивості, наприклад:

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

Потім ви зможете деактивувати профіль за допомогою -DskipFirstProfile або з -P !firstProfile, але в іншому випадку профіль буде активним.

Див.: Maven: Повна довідка, Активація профілю - Активація відсутністю властивості


За яких обставин це корисно чи краще, ніж чітко згадувати про сам профіль? тобто замість передачі в -DmyFlag я можу зробити -PmyDefaultProfile право? Чи є якась користь від управління ним прапором, який мені не вистачає?
Четя,

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 точно, так. Чому б не запропонувати це як запит на функцію?
Шон Патрік Флойд

Це на зразок пов’язаного ... Одне мені подобається робити це додавати всі модулі до активного профілю за замовчуванням, тому що я думав, що немає можливості видалити модуль із виконання. У 3.2.1 вони додали це, як показано тут . Я залишаю цей коментар на випадок, якщо хтось спіткнеться тут і використовує модулі з аналогічної мені причини.
Капітан Людина

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це все ще активно. Так!


4

Ви можете просто перелічити всі профілі, які потрібно активувати в командному рядку як такі:

-P профіль-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

-1

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

Тільки тому, що ви використовуєте профілі, це не означає, що все, що ви робите, має бути в профілі.


Це не дає відповіді на запитання - OP чітко зазначає, що профіль повинен бути "завжди активним, якщо він не буде деактивовано". Імовірно, існує потреба іноді відключати це явно, що ця відповідь не дозволяє.
sleske
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.