如何为 Maven 插件指定默认目标?

Posted

技术标签:

【中文标题】如何为 Maven 插件指定默认目标?【英文标题】:How to specify a default goal for a Maven plugin? 【发布时间】:2019-11-26 11:47:38 【问题描述】:

我已经定义了一个具有多个目标的 Maven 插件。目前用户运行我的插件如下:

<plugin>
    <groupId>myGroupId</groupId>
    <artifactId>myArtifactId</artifactId>
    <version>someVersion</version>
    <executions>
        <execution>
            <goals>
                <goal>myGoal</goal>
            </goals>
        </execution>
    </executions>
</plugin>

但我见过其他插件,例如 maven-compiler-plugin 和 Flyway,不需要指定 execution:https://flywaydb.org/getstarted/java

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>5.2.4</version>
    <configuration>
        <url>jdbc:h2:file:./target/foobar</url>
        <user>sa</user>
        <locations>
            <location>classpath:db/migration</location>
        </locations>
    </configuration>
</plugin>

当用户排除&lt;executions&gt; 块时,如何指定默认运行的目标?

【问题讨论】:

仔细查看 Flyway 页面。 pom.xml 只是设置所需的配置。进一步的说明都手动调用 mojos!我认为我没有看到默认执行,除非由父模块提供(不是直接来自插件) 目标通常有一个“首选”阶段,它将绑定到。 我认为下面的链接会对您有所帮助。 maven.40175.n5.nabble.com/… 【参考方案1】:

AFAIK,Maven 插件没有默认目标。

您可以在不添加目标的情况下配置插件。但这不会执行插件。

插件必须在命令行上显式执行(如flyway:migrate)或在整个生命周期内自动执行(如compile:compilejar:jar)。

【讨论】:

这强烈建议在 Maven 中为某些核心插件进行愚蠢的硬编码执行配置,最好将其定义为可选的默认执行 \@Mojo 属性标志,用于声明“defaultPhase” \@Mojo 属性的插件. @Infernoz 默认插件执行为defined by the packaging type。我认为这样定义它是有意义的,因为您甚至不需要声明要运行的插件——不可能扫描所有存在的插件来知道需要执行哪个插件。当您声明没有这些的插件时,Maven 只是不支持每种包装类型的默认目标+阶段。【参考方案2】:

我假设您正在使用 Java5 Annotations 将您的插件标记为可用 mojo? (而不是 javadoc 的生活方式)。

@Mojo 注释有一个defaultPhase 属性。

一旦用户将插件添加到构建中,这些默认值(如果设置)将被使用。

Flyway Migrate Mojo 也是这样做的。

编译器插件是一个不好的例子,因为它是 maven 生命周期本身的default plugin bindings 的一部分。所以灵态本身会知道要运行什么魔法。

这些是maven plugin api 的文档,using annotations 的文档就在附近。

如果不是你的插件,你可以把你想要的配置放到父 pom 的 pluginManagement 部分。

【讨论】:

我询问了默认目标,而您的回答谈到了默认阶段。我的 Mojo 已经有一个默认阶段。如果用户在他们的 pom 中包含没有 &lt;execution&gt; 块的插件,我希望 Maven 执行默认目标。 我明白了。对不起,我弄错了。我的理解是,只有生命周期配置中的插件和目标不需要任何更多配置(通过包装来)。只需将插件(如 flyway maven 插件)添加到构建中而不执行任何操作。 defaultPhase 属性只是从 pom.xml 中的执行保存该配置。您要运行的目标仍然需要指定。即使是像故障安全插件这样非常常见的插件也需要这样做,因为它们不是默认插件绑定的一部分。 此时的选项可能是创建您自己的打包和默认绑定或通过创建扩展:maven.apache.org/guides/mini/guide-using-extensions.html 对 Maven 模块使用自定义打包有意义吗?那还能用吗。扩展程序允许我做什么?我认为我需要输出一个自定义工件类型(非 JAR)才能工作,但在我的情况下,我正在生成一个 Maven 插件,所以我不确定它是否会工作...... 每个模块都可以有自己的包装。我认为即使使用自定义包装,您也应该能够创建 .jar 文件。但这是很少见的事情。人们可能会感到困惑。通过扩展,您可以增强生命周期:maven.apache.org/examples/maven-3-lifecycle-extensions.html - 这可能足以简化插件配置。人们需要添加扩展名。也是一件难得的事情。我认为一些执行和插件配置对于任何 maven 插件都是完全可以接受的。

以上是关于如何为 Maven 插件指定默认目标?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Jetty 的 Maven Cargo 插件指定 jetty-env.xml 文件?

maven如何用默认替换生命周期默认插件

Jetty 插件如何为 Maven 工作?

Maven 错误“不支持注释.....”

如何为插件组件设置 CMAKE 导入目标?

十一中如何为所有页面指定默认布局?