我认为Maven Tiles可以帮助您解决特定的用例。它仍在进行中,但是目前可以完成您所描述的内容,我设法“分解”了wicket-quickstart并成功运行了Jetty,甚至添加了多模块结构。
任何评论或提示都非常受欢迎。谢谢,毛里齐奥
解决方法按组成而不是继承导入Maven插件配置。可以通过构建扩展来完成吗?
我已经使用maven超过3年了,其中一个缺点总是困扰着我。现在该是找到解决方案的时候了。
问题:
我有一个带有3个孩子的“爸爸”maven模块:“男孩”,“女孩”和“孩子”。对于默认的“全新安装”版本,这些子级中的每个子级都必须具有自己独特的插件配置集。我不想把这种配置放在孩子们的绒球上。我宁愿将它放在以后可以重用的地方。
我曾尝试为此使用配置文件,但无法正常工作-请查看我的评论和有关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);}if('kid'.equals(properties.getProperty('project_type'))){ setExecutionPhase(project,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将输出预期的结果:男孩将是男孩,女孩将是女孩,而两者都是孩子。
问题是:我们可以做得更好吗?
从理论上讲,构建扩展可以从不同的pom导入男孩,女孩和孩子的构建配置定义…对吗?这将是将[build]配置导入pom的一种聪明而优雅的方法。
有很多可用的maven插件,但是我看不到很多(实际上任何一个)可以插入到构建中的可用构建扩展。有人知道构建扩展对此有帮助吗?
更新资料
这不是一个实际的答案,但这是我的问题的实际解决方案,所以这里就去。
按组成而不是继承导入Maven插件配置。可以通过构建扩展来完成吗?
大概
有人知道构建扩展对此有帮助吗?
我很确定没有一个
但是,有一个使用配置文件的解决方案。
诀窍在于, 实际上是继承了基于文件的配置文件激活 (尽管仅适用于maven3)
请查看MNG-5127附带的daddy2.zip
这比使用构建扩展策略更好,因为使用配置文件比仅更改几个插件执行阶段提供了更大的灵活性。
更新2
有人知道构建扩展对此有帮助吗?
我很确定没有一个
其实有事!
它作为项目附加在MNG-5102中(由MaurizioPillitu设计),我尚未对其进行测试,但是看来它与建议的构建扩展非常接近。