如何在另一个插件中使用 Maven Exec 插件作为库?

How to use Maven Exec Plugin as Library in another plugin?

我目前正在使用 Exec Maven 插件,它可以很好地用于:

<plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.4.0</version>
      <executions>
        <execution>
          <id>myExec</id>
          <goals>
            <goal>exec</goal>
          </goals>
          <phase>generate-sources</phase>
          <configuration>
            <executable>myExec</executable>
            <arguments>
              <argument>--foo=${basedir}/src/test/resources/test.xml</argument>
              <argument>--output-directory=target/generated-sources/output</argument>
            </arguments>
          </configuration>
        </execution>
      </executions>
    </plugin> 

我也在使用构建助手插件如下:

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.10</version>
        <executions>
          <execution>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>${project.build.directory}/generated-sources/output</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>

然而,这非常冗长,我希望多个 maven 模块能够使用这个程序,而不必重新键入所有特定的 exec 插件 XML 以及构建器 XML。

问题:如何将这两个插件合并到另一个插件中?

我已经使用 maven 原型生成器生成了一个示例 maven 插件并且有一个 Mojo class:

@Mojo(name = "touch", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
public class MyMojo
        extends AbstractMojo
{


    public void execute()
            throws MojoExecutionException
    {
        ExecMojo exec = new ExecMojo();
    }
}

并且已经弄清楚如何创建新的 ExecMojo。

问题 如何像在上面的 XML 中一样在此处添加参数?我怎样才能将这些参数整合到我的插件中?

与其创建自己的 Maven 插件,这可能会降低项目的可移植性和可维护性,不如考虑以下方法:

  • 有一个共同的 parent pom
  • 配置给定的插件配置,可选 Maven profile
  • 在相关模块中,指向这个parent。可选(在配置文件的情况下)在需要时按需激活它。

一个简单的 parent pom 如下所示:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample</groupId>
    <artifactId>sample-maven-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <path.to.myexec>path</path.to.myexec>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.4.0</version>
                <executions>
                    <execution>
                        <id>myExec</id>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <phase>generate-sources</phase>
                        <configuration>
                            <executable>${path.to.myexec}\myExec</executable>
                            <arguments>
                                <argument>--foo=${basedir}/src/test/resources/test.xml</argument>
                                <argument>--output-directory=${project.build.directory}/generated-sources/output</argument>
                            </arguments>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.10</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>${project.build.directory}/generated-sources/output</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>myexec-profile</id>
            <build>
                <plugins>
                    <!-- optionally move here the configuration above -->
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

请注意我添加的 path.to.myexec 属性,如果需要,将在 children 项目中覆盖,以指向正确的相对路径。

然后,一旦安装在您的机器上(或部署在您公司的 Maven 存储库中),就可以在任何相关的 Maven 项目中引用如下:

<parent>
    <groupId>com.sample</groupId>
    <artifactId>sample-maven-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

不需要 re-declare 上面的插件配置及其冗长的方法。它们将自动成为默认构建的一部分,作为从此 parent.

继承的构建配置的一部分

在以下情况下,分析方法也可以作为解决方案:

  • 您想重用现有的 parent pom 已经被不需要此配置的项目使用
  • 您并不总是需要在您的构建中使用此行为,并且希望按需激活它

在这种情况下,您可以通过以下方式激活它,例如:

mvn clean package -Pmyexec-profile

鉴于您已经相应地设置了 parent 并且您将上面的配置移到了配置文件中。


这种方法的优点:

  • 比编写新的 maven 插件更轻便(需要编写、测试、维护、分发等)
  • 消费者模块更容易定制一些东西:在任何时候他们都可以作为例外覆盖parent的配置
  • 不那么脆弱:试想一下,如果其中一个插件的另一个版本提供了一个对你很重要的错误修复,那么配置一个 XML 就很容易了,更不用说更改自定义的 maven 插件等了。
  • 配置保持集中,transparent可访问和进一步治理的入口点
  • 更简单的故障排除:任何时候消费者模块都可以 运行 mvn help: effective-pom 并查看合并的完整有效 pom(作为 parent 和当前 pom 的集合)并检查它实际上是什么运行宁

如何在某些模块中跳过 parent 插件执行

一种仅在某些模块中执行此插件同时具有与其他模块相同的 parent 的简单(且经常使用)方法如下:

  • 定义一个新的属性,我们称它为skip.script.generation,默认值为true,定义在parent pom.
  • 在上述插件的 skip 配置条目中使用此跳过 属性。
  • Re-define 仅在相关模块中将 属性 设置为 false。这将是他们的 pom.xml 文件所需的唯一配置,因此减少到一行(保持非常低的冗长)。

exec-maven-plugin 提供了这样一个 skip 选项,不幸的是 build-helper-maven-plugin 没有。但这并没有阻止我们。我们仍然可以跳过使用 phase 元素的两个执行,将其设置为不存在的阶段,如 none 并因此跳过它们。这是合适的,因为这两个执行实际上已经附加到同一个阶段,generate-sources.

对于这种方法,让我们将新的 属性 重命名为 script.generation.phase

举个例子:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample</groupId>
    <artifactId>sample-maven-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <path.to.myexec>path</path.to.myexec>
        <script.generation.phase>none</script.generation.phase>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.4.0</version>
                <executions>
                    <execution>
                        <id>myExec</id>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <phase>${script.generation.phase}</phase>
                        <configuration>
                            <executable>${path.to.myexec}\myExec</executable>
                            <arguments>
                                <argument>--foo=${basedir}/src/test/resources/test.xml</argument>
                                <argument>--output-directory=${project.build.directory}/generated-sources/output</argument>
                            </arguments>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.10</version>
                <executions>
                    <execution>
                        <phase>${script.generation.phase}</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>${project.build.directory}/generated-sources/output</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>myexec-profile</id>
            <build>
                <plugins>
                    <!-- optionally move here the configuration above -->
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

请注意两个插件的 <phase>${script.generation.phase}</phase> 变化。默认值为 none,此 属性 默认情况下有效地禁用它们的执行。

在另一个模块中,您将拥有以下内容:

<parent>
    <groupId>com.sample</groupId>
    <artifactId>sample-maven-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<properties>
    <script.generation.phase>generate-sources</script.generation.phase>
</properties>

仅此而已。那是。 Maven 在构建期间将 re-define 某个模块的 属性 并在继承自其 parent 的配置中自动替换它,因此再次启用上面的两个执行。