Java 通过组合而不是继承导入maven插件配置。它可以通过构建扩展来完成吗?
通过组合而不是继承导入maven插件配置。它可以通过构建扩展来完成吗 我使用maven已经三年多了,有一个缺点一直困扰着我。 是时候找到解决办法了 问题是: 我有一个“爸爸”maven模块,有三个孩子:“男孩”、“女孩”和“孩子”。 对于默认的“干净安装”构建,每个子级都必须有自己独特的插件配置集。 我不想把这种配置放在孩子们的POM上。我宁愿把它放在以后可以再用的地方 我已经尝试使用配置文件,但它不起作用-请参阅我的评论和附加的项目上 通过对项目进行以下更改,我找到了更好的解决方案: 1) 在daddy的pom上,将[profiles]替换为具有[phase]none[/phase]的插件执行Java 通过组合而不是继承导入maven插件配置。它可以通过构建扩展来完成吗?,java,maven,maven-plugin,maven-extension,Java,Maven,Maven Plugin,Maven Extension,通过组合而不是继承导入maven插件配置。它可以通过构建扩展来完成吗 我使用maven已经三年多了,有一个缺点一直困扰着我。 是时候找到解决办法了 问题是: 我有一个“爸爸”maven模块,有三个孩子:“男孩”、“女孩”和“孩子”。 对于默认的“干净安装”构建,每个子级都必须有自己独特的插件配置集。 我不想把这种配置放在孩子们的POM上。我宁愿把它放在以后可以再用的地方 我已经尝试使用配置文件,但它不起作用-请参阅我的评论和附加的项目上 通过对项目进行以下更改,我找到了更好的解决方案: 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>
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>
男孩
4.0.0
com.family
附属于
这比使用构建扩展策略要好得多,因为使用概要文件提供了比仅仅更改几个插件执行阶段更大的灵活性
更新2
有人知道有一个构建扩展可以帮助实现这一点吗
我很确定没有
事实上有些东西
它作为项目附于(Maurizio Pillitu)
我还没有测试过它,但它似乎做了一些非常接近建议的构建扩展的事情。我认为这可以帮助您处理特定的用例。
它仍在进行中,但目前已经完成了您所描述的,我成功地“分解”并运行Jetty,甚至添加了一个多模块结构
任何评论或暗示都是非常受欢迎的。
谢谢
毛里齐奥到目前为止还没有答案,这令人担忧。。。至少知道这件事是件好事。我的一个愿望是加入“混合”(mixin)。听起来很像你要找的。不幸的是,Maven 3.1似乎没有太多进展;问题列表与我一年前查看时的列表大致相同:-(是的,的确如此。如果我能帮助改善这一点,我会很高兴的:-)我真的对这个问题失去了获得实际答案的希望。但很明显,这是在酝酿中!这太棒了!-->现在0.8-beta-6已经发布了,我添加了一个文件来演示如何使用它。2016年4月稳定的2.8为什么不能将
添加到磁贴以及如何导入依赖项配置?(错误显示:平铺包含依赖项-这将阻止使用者添加排除项,请改用复合项。)
@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);
}
}
}
}
}
}
<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>