Maven — профили дочерних модулей

Проблема

У меня есть проект maven со структурой, аналогичной следующей:
(упрощено для пояснения)

--parent
    |-- child A (inherits from parent)
    |-- child B (inherits from parent)
          |-- child B1 (inherits from B)
          |-- child B2 (inherits from B)
          |-- child B3 (inherits from B)

Только дочерние элементы B1 и B2 должны быть созданы с использованием определенного профиля, который включает в себя некоторые дополнительные элементы сборки. Как следствие, профиль был указан в модуле B.

Логически модули принадлежат модулю B и дополнительно наследуют некоторые зависимости и т. д. (агрегация + наследование).
(представьте что-то вроде B = Frontend, B1 = Пользовательский интерфейс, B2 = темы, B3 = что-то еще)


Вопрос

  • Есть ли возможность по-прежнему использовать полную сборку из родительского pom и активировать соответствующий профиль только в правильных дочерних элементах? (было бы моим любимым решением)
  • Или мне нужны отдельные сборки с использованием расширенных параметров реактора (-pl и т. д.)?
  • Или есть совсем другой подход для таких сценариев?

Изменить

Изменить, поскольку вопрос был идентифицирован как дубликат: проблема в том, что решение, упомянутое в соответствующем вопросе, не работает.

Если я активирую подпрофиль с помощью свойства, он также будет активирован для модуля B (родительского) и для ВСЕХ дочерних элементов.

Я хочу, чтобы он был активен только для дочерних элементов B1 и B2.


person JDC    schedule 11.02.2016    source источник
comment
Возможный дубликат активации дочернего профиля из родительского профиля   -  person A_Di-Matteo    schedule 11.02.2016
comment
Согласен с @A.DiMatteo. Связанный вопрос отвечает на этот вопрос.   -  person Tunaki    schedule 11.02.2016
comment
что это за дополнительные сборочные материалы, которые добавляет профиль? Еще несколько исполнений плагинов? Можете ли вы хотя бы упомянуть задействованные плагины? Есть возможное решение, но мне нужно больше деталей :)   -  person A_Di-Matteo    schedule 13.02.2016
comment
если я добавлю все детали, вопрос взорвется, поэтому я попытался абстрагироваться. Существует множество других исполняемых плагинов, которые включают в себя различные дополнительные элементы в целевом пакете и т. д.   -  person JDC    schedule 15.02.2016


Ответы (1)


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

Определите профиль в родительском pom, образец один:

<profiles>
    <profile>
        <id>sample-profile</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.5</version>
                    <executions>
                        <execution>
                            <id>print-hello</id>
                            <phase>${phase.prop}</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <target>
                                    <echo message="hello there!" />
                                </target>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Обратите внимание, что мы делаем:

  • элемент плагина phase параметризован, поэтому привязка плагина к фазе сборки также будет параметризована
  • Теперь мы можем решить через свойство, к какой фазе прикрепить выполнение этого плагина.
  • Теперь мы можем решить с помощью свойства, чтобы привязать выполнение этого плагина к какой-либо фазе (или к пустой фазе).

Итак, в том же родительском pom определим свойство:

<properties>
    <phase.prop>none</phase.prop>
</properties>

Таким образом, сборка, работающая на родительском pom, не будет привязывать выполнение плагина ни к какой фазе (none не является ключевым словом или известным значением, просто стандартом де-факто, используемым для несуществующей фазы, вы можете оставить его пустым или поместить его любое значение, которое вы хотите, оно будет иметь тот же эффект) и, следовательно, пропустите его. Он также будет пропущен по умолчанию во всех заявленных модулях. Профиль по-прежнему будет активен в каждом модуле, но будет безвреден, поскольку по умолчанию не запускает никаких плагинов.

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

<properties>
    <phase.prop>package</phase.prop>
</properties>

При последующей активации профиля из основной сборки (родительской)

mvn clean install -Psample-profile

Родитель применит его ко всем модулям, но эффективное выполнение профиля произойдет только там, где значение phase.prop имеет значение, имеющее значение maven.

Если вам нужно иметь разные фазы для разных исполнений плагинов, вы можете определить более одного свойства и применить один и тот же шаблон.

Если у вас нет выполнения плагина, а есть глобальная конфигурация плагина для плагина, уже запущенного Maven (как часть его упаковки и сборки по умолчанию), вы можете переопределить его выполнение, переопределив идентификатор выполнения по умолчанию.

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

  • не все плагины предоставляют запись конфигурации skip
  • использование элемента phase не связано с какой-либо конфигурацией и может быть повторно использовано для выполнения, привязанного к той же фазе
person A_Di-Matteo    schedule 16.02.2016
comment
Я реализовал ваше решение, и оно, кажется, работает. Единственная проблема заключается в том, что мои плагины профилей выполняются на разных этапах. Теперь мне нужно установить 4 свойства внутри дочерней помпы. Я попытался сделать это с помощью плагина maven antrun на этапе проверки (ребенок устанавливает для свойства значение true, а antrun устанавливает все остальные свойства), но, похоже, это не работает. В любом случае спасибо, если я не найду решение для одновременной установки нескольких свойств, это все равно нам поможет. - person JDC; 22.02.2016
comment
@JDC Возможно, Плагин свойств Maven помогает настроить несколько свойств. - person Gerold Broser; 04.02.2018