如何为 maven 插件定义默认 mojo
Posted
技术标签:
【中文标题】如何为 maven 插件定义默认 mojo【英文标题】:How to define a default mojo for a maven plugin 【发布时间】:2011-04-20 15:28:08 【问题描述】:我写了一个插件,在 target/generated-sources/ 中生成一个文件。 这个插件只有一种魔力。这个 mojo 声明如下:
/**
* @goal convertsql
* @phase generate-sources
* @requiresProject
*/
public class ConverterMojo extends AbstractMojo
在项目中,我想使用插件,但如果我不指定执行标签,它就不起作用:
<executions>
<execution>
<id>convert</id>
<goals><goal>convertsql</goal></goals>
<phase>generate-sources</phase>
</execution>
</executions>
我只想像这样配置插件:
<plugin>
<groupId>com.my.plugins</groupId>
<artifactId>sqlconverter</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<sourceFile>src/main/resources/sql/schema_oracle.sql</sourceFile>
</configuration>
</plugin>
是否可以为我的插件指定默认的 mojo ?默认目标和阶段在mojo中定义...我的意思是,当使用jar插件时,我不必告诉我要执行的目标,在哪个阶段...它是自动的。
谢谢!
【问题讨论】:
你的插件看起来怎么样? 【参考方案1】:让您的 Maven 插件在其默认阶段执行时自动运行其默认目标是不可能的。这很令人困惑,因为有很多标准插件“绑定”用于特定的包装。这些在 Maven 核心中定义:https://maven.apache.org/ref/3.6.1/maven-core/default-bindings.html
例如,对于 WAR 打包它是:
<phases>
<process-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:resources
</process-resources>
<compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
</compile>
<process-test-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
</process-test-resources>
<test-compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
</test-compile>
<test>
org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
</test>
<package>
org.apache.maven.plugins:maven-war-plugin:2.2:war
</package>
<install>
org.apache.maven.plugins:maven-install-plugin:2.4:install
</install>
<deploy>
org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
</deploy>
</phases>
通过在插件中定义默认阶段,您不必指定它,只需指定目标即可。在你的情况下:
<executions>
<execution>
<id>convert</id>
<!--
Not needed for default phase of plugin goal:
<phase>generate-sources</phase>
-->
<goals>
<goal>convertsql</goal>
</goals>
</execution>
</executions>
另见https://maven.apache.org/developers/mojo-api-specification.html(查找@phase
)。相关引用(我的重点):
定义一个默认阶段以绑定 mojo 执行,如果用户这样做 没有在 POM 中明确设置阶段。注意:此注释不会 将插件声明添加到时自动运行 mojo POM。 它仅允许用户从 周围的元素。
【讨论】:
【参考方案2】:您需要将META-INF/plexus/components.xml
文件添加到您的插件并在您的插件块中设置<extensions>true</extensions>
。
参见 Maven Book 中的 11.6.3. Overriding the Default Lifecycle 以供参考
【讨论】:
谢谢,我试过lifecycle.xml,components.xml,不能让它工作...我忘了这个想法,我会把配置放在pom中。 @Jerome 我自己也没有真正做过。我只是引用了文档:-) 这是为自定义包装类型指定自定义生命周期的方法。以上是关于如何为 maven 插件定义默认 mojo的主要内容,如果未能解决你的问题,请参考以下文章
从自定义 mojo 访问 maven 插件的运行时配置的最佳方式?
如何在 Maven mojo 中使用 MavenBuildHelper