Импортируйте конфигурацию плагина maven по композиции, а не наследованию. Можно ли это сделать с помощью расширений сборки?
Импортировать конфигурацию плагина maven по составу, а не наследованию. Можно ли это сделать с расширениями сборки?
Я использую maven уже более 3 лет, и есть один недостаток, который всегда меня бил.
Настало время найти решение для этого уже.
Проблема:
У меня есть модуль "daddy" maven с тремя детьми: "мальчик", "девушка" и "ребенок".
Каждый из этих детей должен иметь свой собственный набор конфигураций плагинов для стандартной сборки "чистой установки".
Я не хочу ставить эту конфигурацию на детские поры. Я бы предпочел бы разместить его где-нибудь, чтобы я мог повторно использовать его позже.
Я пробовал использовать профили для этого, и он не работает - см. мой комментарий и прилагаемый проект на MNG-5127
Я нашел лучшее решение, внеся следующие изменения в проект daddy.zip:
1) На daddy pom Замените [профили] плагинами, имеющими [фазу] none [/phase]
<build>
...
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>printboy</id>
<phase>none</phase>
<configuration>
<target>
<echo message="@@@@@@@@@@@@ HELLO! Iam a BOY project"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>printkid</id>
<phase>none</phase>
<configuration>
<target>
<echo message="@@@@@@@@@@@@ HELLO! Iam a KID project"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>printgirl</id>
<phase>none</phase>
<configuration>
<target>
<echo message="@@@@@@@@@@@@ HELLO! Iam a GIRL project"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
2) На том же pom добавлено расширение пользовательской сборки
<build>
<extensions>
<extension>
<groupId>br.com.touchtec.maven.plugins</groupId>
<artifactId>execution-enabler-extension</artifactId>
<version>1.0.0-SNAPSHOT</version>
</extension>
</extensions>
...
</build>
3) Расширение изменяет фазы выполнения плагина на основе значений свойства проекта. Java-код ниже.
@Component(role = AbstractMavenLifecycleParticipant.class, hint = "enableif")
public class EnableIfExtension extends AbstractMavenLifecycleParticipant {
@Override
public void afterProjectsRead(MavenSession session)
throws MavenExecutionException {
String phase = "validate";
for(MavenProject project : session.getProjects()){
Properties properties = project.getProperties();
if(properties != null){
if("boy".equals(properties.getProperty("project_type"))){
setExecutionPhase(project, "printboy", phase);
setExecutionPhase(project, "printkid", phase);
}
if("girl".equals(properties.getProperty("project_type"))){
setExecutionPhase(project, "printgirl", phase);
setExecutionPhase(project, "printkid", phase);
}
if("kid".equals(properties.getProperty("project_type"))){
setExecutionPhase(project, "printkid", phase);
}
}
}
}
private void setExecutionPhase(MavenProject project, String executionId, String phase) {
for(Plugin plugin : project.getBuild().getPlugins()){
if(plugin.getExecutions() != null){
for(PluginExecution execution : plugin.getExecutions()){
if(executionId.equals(execution.getId())){
execution.setPhase(phase);
}
}
}
}
}
}
4) В детском модуле poms нужно определить свойство, которое будет сообщать расширению сборки, что делать, например, проект мальчика:
<project>
<properties>
<project_type>boy</project_type>
</properties>
<modelVersion>4.0.0</modelVersion>
<groupId>com.family</groupId>
<artifactId>boy</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>com.family</groupId>
<artifactId>daddy</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- No "build" section. Beautifull. -->
</project>
Вызов mvn clean install в проекте daddy, как это, приведет к желаемому результату: мальчики будут мальчиками, девочки будут девочками, и оба будут детьми.
Вопрос: можем ли мы лучше?
Теоретически расширение сборки может импортировать определения конфигурации сборки для мальчика, девушки и ребенка из разных попов... правильно?
Это был бы умный и элегантный способ импорта конфигурации [build] в pom.
Есть много доступных плагинов maven, но я не вижу много (фактически любых) доступных расширений сборки, которые можно подключить к сборке.
Кто-нибудь знает расширение сборки, которое помогает с этим?
Update
Это не реальный ответ, но это фактическое решение моей проблемы, поэтому здесь идет.
Импортировать конфигурацию плагина maven по составу, а не наследованию. Можно ли это сделать с расширениями сборки?
Возможно
Кто-нибудь знает расширение сборки, которое помогает с этим?
Я уверен, что нет никого
Однако существует решение с использованием профилей.
Фокус в том, что активация профиля на основе файлов фактически наследуется (она работает только с maven3)
См. daddy2.zip, прикрепленный к MNG-5127
Это лучше, чем использование стратегии расширения сборки, поскольку использование профиля обеспечивает большую гибкость, чем просто изменение нескольких этапов выполнения плагинов.
Обновление 2
Кто-нибудь знает расширение сборки, которое помогает с этим?
Я уверен, что нет никого
На самом деле есть что-то!
Он прикреплен как проект в MNG-5102 (автор Maurizio Pillitu)
Я не тестировал его, но, похоже, он делает что-то очень близкое к предлагаемому расширению.
Ответы
Ответ 1
Я думаю, что Maven Tiles может помочь вам в вашем конкретном случае использования.
Он по-прежнему работает, но в настоящее время он выполняет то, что вы описываете, мне удалось "разложить" wicket-quickstart и запустить Jetty успешно, даже добавив многомодульную структуру.
Любые комментарии или подсказки более чем приветствуются.
Благодаря, Маурицио