【发布时间】:2012-07-29 18:23:40
【问题描述】:
通过组合而不是继承来导入 maven 插件配置。可以通过构建扩展来完成吗?
我使用 maven 已经 3 年多了,有一个缺点一直困扰着我。 是时候找到解决方案了。
问题:
我有一个带有 3 个孩子的“爸爸”maven 模块:“男孩”、“女孩”和“孩子”。 对于默认的“全新安装”构建,这些子组件中的每一个都必须有自己独特的插件配置集。 我不想把那个配置放在孩子们的 poms 上。我宁愿把它放在以后可以重复使用的地方。
我已尝试为此使用配置文件,但它不起作用 - 请参阅我在 MNG-5127 上的评论和附加项目
通过对daddy.zip 项目进行以下更改,我找到了更好的解决方案:
1) 在爸爸的 pom 中,将 [profiles] 替换为具有 [phase]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>
像这样在 daddy 项目上调用 mvn clean install,将输出期望的结果:男孩是男孩,女孩是女孩,两者都是孩子。
问题是:我们能做得更好吗?
理论上,构建扩展可以从不同的 pom 导入男孩、女孩和孩子的构建配置定义......对吗? 这将是一种将 [build] 配置导入 pom 的聪明而优雅的方式。
有很多可用的 maven 插件,但我没有看到很多(实际上是任何)可以插入构建的可用构建扩展。 有谁知道有助于解决此问题的构建扩展?
更新
这不是一个实际的答案,但它是我的问题的实际解决方案,所以这里。
通过组合而不是继承来导入 maven 插件配置。可以通过构建扩展来完成吗?
大概
有谁知道可以帮助解决此问题的构建扩展?
我很确定没有一个
但是,有一个使用配置文件的解决方案。
诀窍在于基于文件的配置文件激活实际上是继承的(它只适用于 maven3)
请参阅MNG-5127 所附的daddy2.zip
这比使用构建扩展策略要好得多,因为使用配置文件提供了比仅仅更改几个插件执行阶段更大的灵活性。
更新 2
有谁知道可以帮助解决此问题的构建扩展?
我很确定没有一个
其实是有的!
它作为项目附加在MNG-5102(作者 Maurizio Pillitu) 我尚未对其进行测试,但它似乎与提议的构建扩展非常接近。
【问题讨论】:
-
目前没有答案,这很令人担忧……至少知道I'm not alone是件好事。
-
Maven 3.1 中的一个愿望是包含“mixins”(jira.codehaus.org/browse/MNG-5102)。听起来很像您正在寻找的东西。不幸的是,Maven 3.1 似乎并没有什么进展。问题列表看起来与我一年多前查看时大致相同。 :-(
-
确实如此。如果FreedomSponsors 可以帮助改善这一点,我会很高兴:-)
-
我真的失去了在这个问题上得到实际答案的希望。但显然,正在酝酿中!这太棒了! --> twitter.com/maoo/status/230704704668192768
标签: java maven maven-plugin maven-extension