Импорт конфигурации подключаемого модуля maven по составу, а не по наследству. Можно ли это сделать с помощью расширений сборки?
Импорт конфигурации подключаемого модуля maven по составу, а не по наследству. Можно ли это сделать с помощью расширений сборки?
Я использую Maven более 3-х лет, и есть один недостаток, который всегда беспокоил меня. Пришло время найти решение для этого уже.
Эта проблема:
У меня есть модуль "папочка" maven с 3 детьми: "мальчик", "девочка" и "ребенок". У каждого из этих дочерних элементов должен быть свой отдельный набор конфигураций плагинов для сборки по умолчанию "чистой установки". Я не хочу ставить эту конфигурацию на детские помпоны. Я бы предпочел положить его куда-нибудь, чтобы потом использовать позже.
Я попытался использовать профили для этого, и это не работает - пожалуйста, смотрите мой комментарий и прикрепленный проект на MNG-5127
Я нашел лучшее решение, внеся следующие изменения в проект daddy.zip:
1) На папина поме, заменил [профили] на выполнение плагинов, у которых [фаза] отсутствует [/ фаза]
<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) На том же поме добавлено собственное расширение сборки
<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 дочернего модуля должны только определить свойство, которое сообщит расширению сборки, что делать, например, проект boy:
<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 для проекта папочки, подобный этому, даст желаемый результат: мальчики будут мальчиками, девочки будут девочками, и оба будут детьми.
Вопрос в том, можем ли мы сделать лучше?
Теоретически, расширение сборки может импортировать определения конфигурации сборки для мальчика, девочки и ребенка из разных poms... верно? Это был бы умный и элегантный способ импорта конфигурации [build] в pom.
Существует множество доступных плагинов для Maven, но я не вижу большого количества (вообще-то) доступных расширений сборки, которые можно подключить к сборке. Кто-нибудь знает расширение сборки, которое помогает с этим?
Обновить
Это не фактический ответ, но это реальное решение моей проблемы, так что здесь.
Импорт конфигурации подключаемого модуля maven по составу, а не по наследству. Можно ли это сделать с помощью расширений сборки?
Наверное
Кто-нибудь знает расширение сборки, которое помогает с этим?
Я уверен, что нет ни одного
Тем не менее, есть решение с использованием профилей.
Хитрость в том, что файловая активация профиля фактически наследуется (хотя она работает только с maven3)
Пожалуйста, смотрите daddy2.zip, прикрепленный к MNG-5127
Это намного лучше, чем использование стратегии расширения сборки, поскольку использование профиля обеспечивает большую гибкость, чем просто изменение нескольких этапов выполнения плагина.
Обновление 2
Кто-нибудь знает расширение сборки, которое помогает с этим?
Я уверен, что нет ни одного
На самом деле есть что-то!
Он прикреплен как проект в MNG-5102 (автор Maurizio Pillitu). Я не тестировал его, но, похоже, он делает что-то очень похожее на предлагаемое расширение сборки.
1 ответ
Я думаю, что Maven Tiles может помочь вам в вашем конкретном случае использования. Он все еще находится в стадии разработки, но в настоящее время он выполняет то, что вы описываете, мне удалось "разложить" wicket-quickstart и успешно запустить Jetty, даже добавив многомодульную структуру.
Любые комментарии или подсказки приветствуются. Спасибо, Маурицио