通过组合而不是继承导入 maven 插件配置。可以使用构建扩展来完成吗?

2022-09-03 15:39:28

通过组合而不是继承导入 maven 插件配置。可以使用构建扩展来完成吗?

我已经使用maven超过3年了,有一个缺点一直困扰着我。现在是时候为此找到解决方案了。

问题:

我有一个“爸爸”专家模块,有3个孩子:“男孩”,“女孩”和“孩子”。这些子级中的每一个都必须具有自己不同的插件配置集,以便进行默认的“全新安装”构建。我不想把这个配置放在孩子们的pom上。我宁愿把它放在一个以后可以重用的地方。

我已尝试为此使用配置文件,但它不起作用 - 请参阅我的评论和MNG-5127上的附加项目

通过在爸爸项目上进行以下更改,我找到了更好的解决方案.zip

1)在爸爸的pom上,将[配置文件]替换为具有[阶段]无[/阶段]的插件执行

<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只需要定义一个属性,该属性将告诉构建扩展做什么,例如,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干净安装,将输出所需的结果:男孩将是男孩,女孩将是女孩,两者都是孩子。

问题是:我们能做得更好吗?

从理论上讲,构建扩展可以导入来自不同poms的男孩,女孩和孩子的构建配置定义...右?这将是将 [build] 配置导入 pom 的一种聪明而优雅的方式。

有很多可用的maven插件,但我没有看到很多(实际上任何)可用的构建扩展可以插入到构建中。有没有人知道一个有助于此的构建扩展?


更新

这不是一个实际的答案,但它是我的问题的实际解决方案,所以在这里。

通过组合而不是继承导入 maven 插件配置。可以使用构建扩展来完成吗?

可能

有没有人知道一个有助于此的构建扩展?

我很确定没有一个

但是,有一个使用配置文件的解决方案。

诀窍是,基于文件的配置文件激活实际上是继承的(尽管它仅适用于maven3)

请参阅MNG-5127随附的爸爸2.zip

这比使用构建扩展策略要好得多,因为使用配置文件比仅仅更改几个插件执行阶段提供了更大的灵活性。


更新 2

有没有人知道一个有助于此的构建扩展?

我很确定没有一个

其实有东西!

它被附加为MNG-5102(由Maurizio Pillitu)中的项目,我还没有测试过它,但似乎它做了一些非常接近拟议的构建扩展的事情。


答案 1

我认为Maven Tiles可以帮助您解决特定的用例。它仍在进行中,但它目前已经完成了您描述的内容,我设法“分解”了检票口快速入门并成功运行Jetty,甚至添加了多模块结构。

任何评论或提示都非常欢迎。谢谢 毛里齐奥


答案 2

推荐