【问题标题】:How do I execute a set of goals before my Maven plugin runs?如何在我的 Maven 插件运行之前执行一组目标?
【发布时间】:2009-09-15 15:02:53
【问题描述】:

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

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

【问题讨论】:

    标签: java maven-2 maven-plugin


    【解决方案1】:

    您可以通过定义自定义生命周期并在 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.xml 中的插件配置略有不同。您使用 : 作为分隔符来定义目标,而不是指定单独的 groupId、artifactId 和 version 元素,否则它与 pom.xml 中插件配置的执行元素基本相同。您甚至可以在生命周期.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>
    

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

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

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

    【讨论】:

    • 谢谢这看起来应该可以工作。你知道我在哪里可以找到生命周期.xml 中允许的内容吗?
    • 我在答案末尾添加了一些参考。虽然我不知道规范参考
    • Maven 的 Lifecycle.xml 参考存在 here,尽管它没有比示例提供的更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2017-02-22
    • 1970-01-01
    • 2022-02-03
    • 2011-09-01
    相关资源
    最近更新 更多