Использование профилей maven для управления выполнением сборки

Мне нужно изменить сборку maven для большого проекта, чтобы пропустить определенные шаги во время типичных сборок разработки (т.е. не создавать файлы * -source.jar). Я искал "условное исполнение" для maven, но ничего не нашел.

Профиль dev звучит как интуитивно понятный способ сделать это, но я не знаю, как интуитивно понятный maven. Документы для профилей показывают, как устанавливать различные свойства (например, параметры подключения базы данных) для разных профилей. Я предполагаю, что могу установить свойство, а затем проверить, установлено ли это свойство в теге maven-source-plugin - execute - execute.

Правильно ли это сделать условное выполнение в maven?

Какой "правильный" способ сделать это в maven?

Ответ 1

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

<profile>
  <id>source-jars</id>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        ...

И на самом деле есть пример, подобный этому на странице использования maven-source-plugin. Когда вам нужно создать свой артефакт, используйте mvn -p source-jars (или что-то еще). Это! Если вам нужно сделать это только во время релиза, плагин выпускает даже способ определения профилей, которые нужно использовать прямо в конфигурации плагина выпуска.

Ответ 2

Вы можете достичь своей фактической цели по включению плагина source-jars по умолчанию, добавив два профиля в ваш POM. В документации Maven отмечается, что вы можете добавить элемент <activeByDefault>true</activeByDefault> в раздел activation и заявить, что

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

Итак, вы можете добавить два профиля, один из которых - activeByDefault, который включает соответствующий плагин, и другой, который может быть активирован любым из стандартных способов (например, -P из командной строки) до запретить запуск профиля по умолчанию. Следовательно, раздел profiles в вашем pom.xml (или настройках Maven или любом другом) может выглядеть следующим образом:

<profile>
  <id>source-jars</id>
  <activation>
    <activeByDefault>true</activeByDefault>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        ...
      </plugin>
    </plugins>
  </build>
</profile>
<profile>
   <!-- active this profile to disable the source-jars plugin -->
   <id>no-optional-plugins</id>
</profile>

К сожалению, я не вижу способа, чтобы этот метод хорошо масштабировался для управления несколькими плагинами - я думаю, вам нужны профили O(n^2) для плагинов n, но для этого простого случая он должен работать нормально.

Другой возможный более простой вариант с Maven ≥ 2.0.10 состоит в том, чтобы просто иметь профиль source-jars сверху (еще activeByDefault) и вручную деактивировать профиль, если хотите, префикс идентификатора профиля с помощью - или ! после -P CLI:

$ mvn -P !source-jars

Этот метод не имеет проблем с O(n^2) с несколькими плагинами, но он также менее гибкий, поскольку деактивация не может быть вызвана системным свойством, переменной среды, версией JDK и т.д.