无法将 Groovy Maven 插件作为目标执行

Posted

技术标签:

【中文标题】无法将 Groovy Maven 插件作为目标执行【英文标题】:Cannot execute Groovy Maven Plugin as a goal 【发布时间】:2017-01-29 10:53:45 【问题描述】:

我正在使用带有 Groovy Maven 插件的 Apache Maven 3.3.9。这是 pom.xml 的相关部分(内联的 Groovy 脚本只是虚构的):

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>groovy-maven-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <id>myGroovyPlugin</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>execute</goal>
        </goals>
        <configuration>
          <source>
    log.info('Test message: ', 'Hello, World!')
          </source>
        </configuration>
      </execution>
    </executions>
</plugin>

如果我调用mvn install,插件将调用内联 Groovy 脚本作为准备包阶段的一部分,并且工作正常。但是,如果我尝试通过mvn groovy:execute 直接调用插件的目标,我会收到以下错误消息:

[错误] 无法执行目标 org.codehaus.gmaven:groovy-maven-plugin:2.0:execute (default-cli) on project exercise02: the parameters 'source' for goal org.codehaus.gmaven:groovy-maven -plugin:2.0:execute 丢失或无效 -> [Help 1]

【问题讨论】:

对,因为您在没有正确配置的情况下直接调用目标,而不是使用附加配置的执行。 也就是说,正如@chrylis 指出的那样,但是我在 Stack Overflow 上找不到任何与此问题相关的重复项,尽管我相信有很多类似的问题。 【参考方案1】:

您得到的错误已经指向问题:插件找不到source 配置选项,因为它确实只在myGroovyPlugin 执行中配置,即只在execution范围而不是全局配置。

这是configuration 之外的configuration 元素之间的主要区别@ 987654329@(插件的所有执行(甚至从命令行)的全局配置)和execution 内(配置仅适用于特定目标执行)。

要解决此问题,您应该在这种情况下将 executions 部分之外的 configuration 元素移动,因为该插件不是 Maven 在 default bindings 期间调用的插件,这就足够了,并且不会影响您的build:在myGroovyPlugin 执行期间以及从命令行显式执行期间仍将使用它。

来自Maven POM reference,configuration 内的execution

将配置限制为这个特定的目标列表,而不是插件下的所有目标。


为了清楚起见,您应该将其更改为以下内容:

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>groovy-maven-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <id>myGroovyPlugin</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>execute</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <source>log.info('Test message: ', 'Hello, World!')</source>
    </configuration>        
</plugin>

因此,configuration 将成为全局配置并应用于命令行执行并声明为executions


由于您使用的是 Maven 3.3.9,您还可以对invoke directly a specific configuration of an execution 使用稍微详细一点的模式:

mvn groovy:execute@myGroovyPlugin

这种模式在你真的不想要全局配置的情况下很有用,因为你不想影响某个插件的其他(通常是默认的)执行,并且你真的想在一个执行和从命令行。

【讨论】:

这绝对是它!谢谢你。奇怪的是GMaven's documentation 显示了带有executions/execution/configuration/source 的示例,即使完全复制,也不起作用。正如你所说,将其移至configuration/source,为我解决了问题。

以上是关于无法将 Groovy Maven 插件作为目标执行的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ② ( java 和 groovy 插件自带文档任务 | 自定义文档打包任务 | 生成文档包 )

在父模块上执行 Maven 插件目标,但不在子模块上

groovy入门()Groovy插件安装:Maven报Plugin execution not covered by lifecycle configuration

在Java Spring Boot应用程序中引发ClassNotFoundException的Groovy文件

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

将 Maven 与 QT Jambi 一起使用