如何为 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>
当用户排除<executions>
块时,如何指定默认运行的目标?
【问题讨论】:
仔细查看 Flyway 页面。pom.xml
只是设置所需的配置。进一步的说明都手动调用 mojos!我认为我没有看到默认执行,除非由父模块提供(不是直接来自插件)
目标通常有一个“首选”阶段,它将绑定到。
我认为下面的链接会对您有所帮助。 maven.40175.n5.nabble.com/…
【参考方案1】:
AFAIK,Maven 插件没有默认目标。
您可以在不添加目标的情况下配置插件。但这不会执行插件。
插件必须在命令行上显式执行(如flyway:migrate
)或在整个生命周期内自动执行(如compile:compile
或jar: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 中包含没有<execution>
块的插件,我希望 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 插件指定默认目标?的主要内容,如果未能解决你的问题,请参考以下文章