如何在另一个插件中使用 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 的配置中自动替换它,因此再次启用上面的两个执行。
我目前正在使用 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 的配置中自动替换它,因此再次启用上面的两个执行。