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

时间:2016-09-21 09:16:41

标签: java maven groovy maven-3 pom.xml

我正在使用Apache Maven 3.3.9和Groovy Maven插件。这是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脚本作为prepare-package阶段的一部分,并且工作得很好。但是,如果我试着打电话给插件&#39;目标直接通过mvn groovy:execute我收到以下错误消息:

  

[错误]无法执行目标org.codehaus.gmaven:groovy-maven-plugin:2.0:执行(default-cli)项目exercise02:参数&#39; source&#39;目标org.codehaus.gmaven:groovy-maven-plugin:2.0:执行缺失或无效 - &gt; [帮助1]

1 个答案:

答案 0 :(得分:4)

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

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

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

来自Maven POM referenceconfiguration中的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

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