【问题标题】:How to declare a before and after execution of a maven plugin around another plugin execution?如何在另一个插件执行前后声明一个maven插件的执行前后?
【发布时间】:2010-11-30 20:25:04
【问题描述】:

我想在我的插件中创建一个执行顺序,该顺序围绕一个 maven 插件,并在执行另一个 maven 插件之前和之后。所有 3 次执行都是部署阶段的一部分。

这是我想做的一个例子:

  • 阶段:部署
  • url:get: 执行前
  • 依赖:解压
  • url:get: 执行后

注意:url:get 是我自己的 custo mojo,只是使用 commons httpClient 执行一个 http get。

我通常会在下一阶段附加插件执行后,但不幸的是,部署是 jar 生命周期的最后阶段。

提前谢谢你,

科斯塔斯


注意:我的 pom 文件中的以下插件段创建了以下预期的执行顺序:

  • 阶段:部署
  • url:get: 执行前
  • url:get: 执行后
  • 依赖:解压

插件段:

        <plugin>
            <groupId>com.blabla.stpadmin</groupId>
            <artifactId>maven-url-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <executions>
                <execution>
                    <id>stop-stpadmin-service</id>
                    <phase>deploy</phase>
                    <goals>
                        <goal>get</goal>
                    </goals>
                    <configuration>
        ...
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack</id>
                    <phase>deploy</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
        ...
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>com.blabla.stpadmin</groupId>
            <artifactId>maven-url-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <executions>
                <execution>
                    <id>start-stpadmin-service</id>
                    <phase>deploy</phase>
                    <goals>
                        <goal>get</goal>
                    </goals>
                    <configuration>
        ...
                    </configuration>
                </execution>
            </executions>
        </plugin>

【问题讨论】:

  • 您希望它们在部署目标之后还是之前执行?我下面的答案将在部署目标运行后执行它们,这似乎是您所追求的

标签: maven-2 maven-plugin


【解决方案1】:

您可以将每个插件的执行绑定到同一阶段,它们将按照您指定的顺序执行。请注意,它们将在部署目标运行后执行,因此您可能希望将它们绑定到上一个阶段(安装)

更新:为了确保 execution-beforeexecution-after 目标围绕依赖插件执行执行,您需要确保它们在单独的插件中定义.否则这两个配置将被合并并顺序执行。

如果需要在同一个插件中定义两个执行,您可以通过定义自定义生命周期并在您的 Mojo 通过执行注释执行之前调用该生命周期来执行此操作。在this answer 中,我描述了如何创建自定义生命周期并强制在插件运行之前调用它。如果您将 execute-after 目标配置为调用依赖插件,您将获得所需的执行顺序(您甚至可以在该生命周期中调用 execute-before 目标以及)。

下面的例子会在部署阶段依次执行三个插件:

  <plugin>
    <groupId>custom.url.plugin</groupId>
    <artifactId>maven-url-plugin</artifactId>
    <version>1.0</version>
    <executions>
      <execution>
        <phase>deploy</phase>
        <goals>
          <goal>execution-before</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.1</version>
    <executions>
      <execution>
        <phase>deploy</phase>
        <goals>
          <goal>unpack</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>custom.url.plugin</groupId>
    <!--specify final execution in a different plugin to 
           avoid the configurations being merged-->
    <artifactId>maven-url-2-plugin</artifactId>
    <version>1.0</version>
    <executions>
      <execution>
        <phase>deploy</phase>
        <goals>
          <goal>execution-after</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

【讨论】:

  • 您好 Rich,感谢您的回复。我已经测试了您列出的这个插件结构,但我无法获得所需的执行顺序。我期望得到:* phase:deploy * url:get: execution-before * dependency:unpack * url:get: execution-after 但我得到了: * phase:deploy * url:get: execution-before * url:get : 执行后 * 依赖:解包
  • 啊是的,我的错误是“maven-url-plugin”的配置将被合并,然后按顺序执行。如果您能够将执行拆分为两个独立的插件,它将起作用。
  • 我已经用几个选项更新了我的答案来解决这个问题
  • 我创建了一个带有自定义 lyfecycle 的插件,它先分叉 url:get 执行,然后分叉依赖:unpack。从顶级插件传递到分叉插件的参数并不理想,但它可以工作。不过我希望 maven 有一种简单的方法来控制目标的执行顺序。
猜你喜欢
  • 2016-02-27
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多