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