Подтвердить что ты не робот

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

У меня есть профиль в моем 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", первый файл, к сожалению, деактивируется. В документации Maven это указано:

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Я бы хотел, чтобы была такая возможность, я часто пропускал ее. Единственная актуальная проблема 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)

Ответ 3

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

Ответ 5

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

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

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

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

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

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

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

Ответ 6

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

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