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

Ang*_*ket 5 java groovy pom.xml maven-3 maven

我正在使用带有 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>
Run Code Online (Sandbox Code Playgroud)

如果我调用mvn install内联 Groovy 脚本,则插件会在准备包阶段调用该脚本,并且该脚本运行良好。但是,如果我尝试通过直接调用插件的目标,则会mvn groovy:execute收到以下错误消息:

[错误] 无法在项目练习 02 上执行目标 org.codehaus.gmaven:groovy-maven-plugin:2.0:execute (default-cli):目标 org.codehaus.gmaven:groovy-maven-plugin 的参数“源”: 2.0:execute is missing or invalid -> [Help 1]

A_D*_*teo 6

你得到的错误已经指向了这个问题:插件找不到source配置选项,因为它确实只在myGroovyPlugin执行中配置,也就是说,只在execution范围内而不是作为全局配置。

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

要解决此问题,您应该在这种情况下将configuration元素移到部分之外executions,因为该插件不是在Maven 的默认绑定期间调用的插件,它就足够了并且不会对您的构建产生影响:它将在myGroovyPlugin执行期间仍然使用AND 来自命令行的显式执行。

Maven POM 参考中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>
Run Code Online (Sandbox Code Playgroud)

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


由于您使用的是 Maven 3.3.9,您还可以使用稍微详细一点的模式来直接调用执行的特定配置

mvn groovy:execute@myGroovyPlugin
Run Code Online (Sandbox Code Playgroud)

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