当前位置: 首页 > 面试题库 >

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

巢安澜
2023-03-14
问题内容

按组成而不是继承导入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);
                    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>

像这样,在爸爸项目上调用mvn clean install将输出预期的结果:男孩将是男孩,女孩将是女孩,而两者都是孩子。

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

从理论上讲,构建扩展可以从不同的pom导入男孩,女孩和孩子的构建配置定义…对吗?这将是将[build]配置导入pom的一种聪明而优雅的html" target="_blank">方法。

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

更新资料

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

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

大概

有人知道构建扩展对此有帮助吗?

我很确定没有一个

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

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

请查看MNG-5127附带的daddy2.zip

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

更新2

有人知道构建扩展对此有帮助吗?

我很确定没有一个

其实有事!

它作为项目附加在MNG-5102中(由Maurizio
Pillitu设计),我尚未对其进行测试,但是看来它与建议的构建扩展非常接近。


问题答案:

我认为Maven Tiles可以帮助您解决特定的用例。它仍在进行中,但是目前可以完成您所描述的内容,我设法“分解”了wicket-
quickstart
并成功运行了Jetty,甚至添加了多模块结构。

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



 类似资料:
  • 问题内容: 我目前正在评估Maven以改善我们的构建过程。到目前为止,尽管我对Maven IDE并不完全满意,但是普通jar文件的构建和创建仍然可以正常进行。 现在,我已经构建了项目所需的所有库,并且现在进入Eclipse RCP项目。现在我不确定如何继续。 在继续实际的RCP部分之前,我需要先构建一些插件。因此,我实际上有3个问题。 我想构建这些插件,唯一真正的解决方案似乎是maven-bund

  • 我正在尝试使用maven assembly插件生成zip文件程序集。我只剩下两个问题,我想知道是否有可能仅仅通过配置来解决,但作为最后的手段,我也在考虑编写自己的maven插件来扩展maven assembly插件 丢失的两块是 > 将与include模式匹配的每个依赖项放入其自己的 这是我的程序集的相关部分 这将使用

  • 6.3. 通过嵌入结构体来扩展类型 来看看ColoredPoint这个类型: gopl.io/ch6/coloredpoint import "image/color" type Point struct{ X, Y float64 } type ColoredPoint struct { Point Color color.RGBA } 我们完全可以将ColoredPoin

  • 我首先通过执行生成了一个gwt maven项目- mvn原型:生成-Darch etypeGroupId=org.codehaus.mojo-Darch etypeartifactId=gwt-maven-plugin-Darch etypeVersion=2.7.0 在那之后,pom。xml如下所示: 然后我通过内置的eclipse函数将这个项目导入eclipse——导入现有的Maven项目。

  • 问题内容: 我想从Javadoc实现的接口继承Javadoc 。我在Javadoc命令中包含了源代码,并正确继承了文档。 现在,我想知道是否可以使它生成的链接指向Web上的文档,而不是在我的网站上复制它,即“ Specified by:”链接将链接到外部页面。 这可能吗? 问题答案: 有可能,是的。为了能够包含继承的文档,必须在javadoc的sourcepath中找到接口A的源,但不应在传递给用

  • 问题内容: 偏重于继承而不是继承 是非常流行的短语。我读了几篇文章,最后每篇文章都说 当类之间存在纯IS-A关系时,请使用继承。 本文中的一个示例: 在 Apple 和 Fruit 之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者也将其显示为Apple HAS-A Fruit(组成),以显示通过继承实现时的陷阱。 我在这里变得有些困惑,声明的含义是什么 当类之间存在纯IS-A