我目前正在使用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中添加参数?我如何将这些参数集成到我的插件中?
答案 0 :(得分:2)
您可以考虑使用以下方法,而不是创建自己的Maven插件,这可能会降低项目的可移植性和可维护性:
简单的父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>
无需重新声明上面的插件配置及其冗长的方法。它们将自动成为默认构建的一部分,作为此父级的继承构建配置的一部分。
在以下情况下,配置文件的方法也可以是一种解决方案:
在这种情况下,您可以通过以下方式激活它:
mvn clean package -Pmyexec-profile
鉴于您已相应地设置了父级,并且您已将配置移至配置文件中。
此方法的优点:
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将重新定义某个模块的属性,并在从其父级继承的配置中自动替换它,并因此再次启用上述两个执行。