如何为 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 文件添加到您的插件并在您的插件块中设置&lt;extensions&gt;true&lt;/extensions&gt;

参见 Maven Book 中的 11.6.3. Overriding the Default Lifecycle 以供参考

【讨论】:

谢谢,我试过lifecycle.xml,components.xml,不能让它工作...我忘了这个想法,我会把配置放在pom中。 @Jerome 我自己也没有真正做过。我只是引用了文档:-) 这是为自定义包装类型指定自定义生命周期的方法。

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

从自定义 mojo 访问 maven 插件的运行时配置的最佳方式?

我的Dojo中有一个Mojo(如何编写Maven插件)

如何在 Maven mojo 中使用 MavenBuildHelper

基本 maven 插件项目不工作,Mojo 插件描述符不生成

解决maven插件问题:'无法加载mojo'

如何从自定义 maven mojo 创建 maven 配置文件