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

10

我已经定义了一个包含多个目标的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>

当用户排除 <executions> 块时,我该如何指定默认运行的目标?


1
仔细查看Flyway页面。pom.xml只是设置所需的配置。进一步的指令都需要手动调用mojos!除非由父模块(而不是直接来自插件)提供默认执行,否则我认为我没有看到过默认执行。 - drekbour
1
目标通常会有一个它将绑定到的“首选”阶段。 - SAURABH
1
我认为以下链接会对您有所帮助。 http://maven.40175.n5.nabble.com/Can-a-plugin-have-a-default-execution-goal-td108343.html - SAURABH
2个回答

5

据我所知,Maven插件没有默认目标。

您可以配置插件而不添加目标。但这不会执行插件。

插件必须明确地在命令行上执行(例如 flyway:migrate),或通过生命周期自动执行(例如 compile:compilejar:jar)。


这强烈暗示了Maven内部某些核心插件的愚蠢硬编码执行配置,最好定义为具有已声明“defaultPhase”@Mojo属性的插件的可选默认执行@Mojo属性标志。 - Infernoz
1
@Infernoz 默认插件执行是由打包类型定义的。我认为这样定义是有道理的,因为你甚至不需要声明要运行的插件——扫描所有存在的插件以知道哪个需要执行是不可能的。当你没有声明插件时,Maven就不支持每个打包类型的默认目标+阶段。 - Didier L

0

我假设你正在使用Java5的注解来标记你的插件作为可用的mojo?(而不是使用javadoc的方式)。

@Mojo注解有一个defaultPhase属性。

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

Flyway Migrate Mojo也是这样做的。

编译器插件是一个不太好的例子,因为它是maven生命周期本身的默认插件绑定的一部分。所以阶段本身会知道要运行哪个mojo。

这是maven插件API的文档,使用注解的文档也在附近。
如果不是你的插件,你可以将想要的配置放入父POM的pluginManagement部分。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接