如何在一个Maven插件的执行前和执行后声明另一个插件的执行?

20
我想在我的插件中创建一个执行顺序,其中包含另一个Maven插件的前后执行。这三个执行是部署阶段的一部分。
以下是我想要做的示例:
- 阶段:deploy - url:get:execution-before - dependency:unpack - url:get:execution-after 注意:url:get 是我的自定义 mojo,只是使用 commons httpClient 执行 http get。
通常,我会将后置插件执行附加在下一个阶段,但不幸的是 deploy 是 jar 生命周期的最后一个阶段。
谢谢您提前,
Kostas
注:我的 pom 文件中以下插件段创建了以下预期之外的执行顺序:
- 阶段:deploy - url:get:execution-before - url:get:execution-after - dependency:unpack
插件段:
        <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>

你想让它们在部署目标之后执行还是之前执行?我的答案将在部署目标运行后执行它们,这似乎是你想要的。 - Rich Seller
1个回答

18
你可以将每个插件的执行绑定到相同的阶段,它们将按照您指定的顺序执行。请注意,它们将在部署目标运行后执行,因此您可能希望将它们绑定到之前的阶段(install)。
更新:为了确保在依赖插件执行期间执行“执行前”和“执行后”目标,您需要确保它们在单独的插件中定义。否则,这两个配置将被合并并按顺序执行。
如果需要在同一个插件中定义这两个执行过程,您可以通过定义自定义生命周期并通过执行注释在 Mojo 执行之前调用该生命周期来实现。在 此答案 中,我描述了如何创建自定义生命周期并强制在运行插件之前调用它。如果您将“执行后”目标配置为调用依赖关系插件,则可以获得所需的执行顺序(甚至可以在该生命周期中调用“执行前”目标)。
下面的示例将在部署阶段按顺序执行三个插件:
  <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: execution-after * dependency:unpack - Kostas
啊,是的,我的错误在于“maven-url-plugin”的配置将被合并,然后按顺序执行。如果您能够将执行拆分为两个独立的插件,它就可以正常工作了。 - Rich Seller
我已经更新了我的答案,提供了几个选项来解决这个问题。 - Rich Seller
2
我创建了一个带有自定义生命周期的插件,它在 url:get 执行之前分叉执行 dependency:unpack。虽然从顶层插件到分叉的插件的参数传递并不理想,但它起作用了。但是我希望 Maven 有一种简单的方法来控制目标的执行顺序。 - Kostas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接