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

时间:2016-06-09 17:45:08

标签: java maven maven-plugin exec-maven-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> 

我也使用build helper插件,如下所示:

<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。

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

我使用了maven原型生成器来生成一个示例maven插件并拥有一个Mojo类:

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


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

并且已经找到了如何创建新的ExecMojo。

问题我如何在上面的XML中添加参数?我如何将这些参数集成到我的插件中?

1 个答案:

答案 0 :(得分:2)

您可以考虑使用以下方法,而不是创建自己的Maven插件,这可能会降低项目的可移植性和可维护性:

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

简单的父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属性,如果需要,可以在子项目中覆盖,以指向正确的相对路径。

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

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

无需重新声明上面的插件配置及其冗长的方法。它们将自动成为默认构建的一部分,作为此父级的继承构建配置的一部分。

在以下情况下,配置文件的方法也可以是一种解决方案:

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

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

mvn clean package -Pmyexec-profile

鉴于您已相应地设置了父级,并且您已将配置移至配置文件中。

此方法的优点

  • 比编写新的maven插件(需要编写,测试,维护,分发等)更轻松的选择。
  • 消费者模块更容易定制某些内容:他们可以随时将父配置作为例外覆盖
  • 不那么脆弱:想象一下,如果其中一个插件的另一个版本提供了对您很重要的错误修复,那么配置XML很容易,更不容易更改定制的maven插件等。
  • 配置保持集中,透明可访问和进一步治理的切入点
  • 更容易排除故障:消费者模块可以随时运行mvn help: effective-pom并查看合并的完整有效pom(作为父级和当前pom的汇总)并检查它实际运行的内容

如何跳过某些模块中的父插件执行

一种简单(经常使用)的方法,只在某些模块中执行此插件,同时让父项与其他模块共用,如下所示:

  • 定义一个新属性,我们将其称为skip.script.generation,默认值为true,在父pom中定义。
  • 在上面插件的skip配置条目中使用此skip属性。
  • 仅在相关模块中重新定义属性并将其设置为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将重新定义某个模块的属性,并在从其父级继承的配置中自动替换它,并因此再次启用上述两个执行。