java - 我如何在 Maven 插件运行之前执行一组目标?

标签 java maven-2 maven-plugin

我正在编写一个 Maven 插件 (Mojo),它需要在运行之前执行一组标准的其他插件执行。

是否有一种机制可以在我的插件中声明所有目标,这样我就不必依赖用户在他们的 POM 中定义它们?

最佳答案

您可以通过定义自定义生命周期并在您的 Mojo 通过 execute 注释执行之前调用该生命周期来实现此目的。

在您的 Mojo 中,在 Javadoc 中声明要执行的生命周期:

/**
 * Invoke the custom lifecycle before executing this goal.
 * 
 * @goal my-goal
 * @execute lifecycle="my-custom-lifecycle" phase="process-resources"
 */
public class MyMojo extends AbstractMojo {
...

然后在 src/main/resources/META-INF/maven/lifecycle.xml 中定义自定义生命周期。

生命周期有点像 plexus 的 components.xml,但允许您为这些目标指定配置。

请注意语法与 pom 中的插件配置略有不同。您使用 : 作为分隔符定义目标,而不是指定单独的 groupId、artifactId 和 version 元素,否则它与 pom.xml 中插件配置的执行元素的表示法基本相同。您甚至可以在 lifecycle.xml 中使用一些属性(尽管可能并非所有属性都受支持,但我需要检查一下)。

以下示例在 process-resources 阶段使用不同的配置调用依赖插件两次:

<lifecycles>
  <lifecycle>
    <id>download-dependencies</id>
    <phases>
      <phase>
        <id>process-resources</id>
        <executions>
          <execution>
            <goals>
              <goal>
                org.apache.maven.plugins:maven-dependency-plugin:copy-dependencies
              </goal>
            </goals>
            <configuration>
              <includeScope>compile</includeScope>
              <includeTypes>war</includeTypes>
              <overWrite>true</overWrite>
              <outputDirectory>
                ${project.build.outputDirectory}/wars
              </outputDirectory>
            </configuration>
          </execution>
          <execution>
            <goals>
              <goal>
                org.apache.maven.plugins:maven-dependency-plugin:copy-dependencies
              </goal>
            </goals>
            <configuration>
              <includeScope>compile</includeScope>
              <includeTypes>jar</includeTypes>
              <overWrite>true</overWrite>
              <outputDirectory>
                ${project.build.outputDirectory}/jars
              </outputDirectory>
            </configuration>
          </execution>
        </executions>
      </phase>
    </phases>
  </lifecycle>
</lifecycles>

使用这种方法,依赖插件将在 fork 生命周期的 process-resources 阶段的每个配置中被调用一次(所有发生在 Mojo 中定义的执行中)。

在 lifecycle.xml 中,您可以定义多个阶段,以及生命周期每个阶段的多次执行。可用阶段在 Maven lifecycle 中定义.

您可以在 Creating a Custom Lifecycle 中找到有关生命周期的更多信息Maven 书的一部分。它没有给出允许的详尽列表。我知道的唯一其他引用是否来自 Maven 2 alpha , 所以可能不是最新的

关于java - 我如何在 Maven 插件运行之前执行一组目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1427740/

相关文章:

java - 忽略 JAXB 中的根元素

maven - 当我有多个用于该目标的配置时,如何在 Maven 插件中使用特定配置运行特定目标

java - 是否可以使用 Nexus 镜像私有(private) Maven S3 存储库?

java - 是否可以使用 Maven Surefire 插件多次运行相同的测试?

apache - Hadoop:Windows构建-Maven错误

java - Spring RestController 以 html 而不是 json 的形式返回错误

java - @XmlAnyElement 和 @XmlElementRefs

java - AspectJ - 将接口(interface)实例变量传递给切入点

Java - 正确获取 jar 依赖项

java - 使用 Maven 创建独立的源代码发布