更改maven插件执行的顺序

use*_*115 30 maven-3

我是maven的新手.我想改变maven插件执行的顺序.

在我的pom.xml中,我有maven-assembly-plugin和maven-ant-plugin.我使用maven-assembly-plugin创建zip文件和maven-ant-plugin,用于将zip文件从目标复制到其他目录.当我运行pom.xml时,maven-ant-plugin被触发并查找zip文件,最后我收到错误,说找不到zip文件.在maven-ant-plugin需要运行之后,请先建议我如何运行maven-assembly-plugin,以便将zip文件复制到相应的目录.

Sri*_*ran 44

既然你说你是Maven的新手...... Maven构建是一系列有序阶段的执行.这些阶段由基于其包装的项目生命周期决定.

因此,控制一个插件的目标是通过执行其绑定到特定阶段.

希望有所帮助.

编辑:此外,由于Maven 3.0.3,对于绑定到同一阶段的两个插件,执行顺序与您定义它们的顺序相同.例如:

<plugin>
  <artifactId>maven-plugin-1</artifactId>
  <version>1.0</version>
  <executions>
    <execution>
      <phase>process-resources</phase>
      ...
    </execution>
  </executions>
</plugin> 
<plugin>
  <artifactId>maven-plugin-2</artifactId>
  <version>1.0</version>
  <executions>
    <execution>
      <phase>process-resources</phase>
      ...
    </execution>
  </executions>
</plugin> 
<plugin>
  <artifactId>maven-plugin-3</artifactId>
  <version>1.0</version>
  <executions>
    <execution>
      <phase>generate-resources</phase>
      ...
    </execution>
  </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,执行顺序是:

  1. maven-plugin-3(生成资源)
  2. maven-plugin-1(进程资源)
  3. maven-plugin-2(进程资源)


Bap*_*ste 14

处于同一阶段的插件按声明的顺序执行.

在pom层次结构的情况下,您必须将父pom(只是其groupId及其artifactId)中的插件重新声明到子pom中以指定执行顺序:

父pom.xml

<plugins>
    <plugin>
        <groupId>groupid.maven.1</groupId>
        <artifactId>maven-plugin-1</artifactId>
        <version>1.0</version>
        <executions>
            <execution>
                <phase>package</phase>
            </execution>
        </executions>
    </plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)

孩子pom.xml

<plugins>
    <plugin>
        <groupId>groupid.maven.2</groupId>
        <artifactId>maven-plugin-2</artifactId>
        <version>1.0</version>
        <executions>
            <execution>
                <phase>package</phase>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>groupid.maven.1</groupId>
        <artifactId>maven-plugin-1</artifactId>
    </plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)

然后执行是:

  1. maven.plugin.2
  2. maven.plugin.1


Dra*_*oiu 10

这可能是一个老问题,提供的答案是正确的,只是添加了关于继承情况的额外一点,因为我发现自己处于这种情况并且无法弄清楚。

当不提供继承时,插件顺序执行似乎有 2 条规则:

  1. 插件绑定到的阶段按照文档中提供的顺序执行:请参阅构建生命周期简介中的“默认生命周期” 插件执行根据其阶段进行排序。
  2. “在 Maven 2.0.5 及更高版本中,绑定到一个阶段的多个目标按照 POM 中声明的顺序执行,但是不支持同一插件的多个实例。同一插件的多个实例会分组执行在 Maven 2.0.11 及更高版本中一起订购” -

在继承的情况下:“父 POM 绑定在子绑定之后执行。”。因此,如果您的插件没有按照您期望的顺序执行(按照本答案中提到的前两点),您可能应该查看它们是否在父 POM 中定义。-同一阶段插件的执行顺序不正确

我找不到任何地方明确记录这一点,但是有一个开放的票据来记录计算插件执行顺序的算法


mik*_*lly 8

在Maven 3.0.3及更高版本中,有两个规则

  1. 插件执行根据其阶段进行排序.有关阶段的顺序,请参阅 https://maven.apache.org/ref/current/maven-core/lifecycles.html.

例如,这里mavin-plugin-1在maven-plugin-2之前执行,因为process-resources阶段被定义为在编译阶段之前发生.

<plugin>
  <artifactId>maven-plugin-2</artifactId>
  <version>1.0</version>
  <executions>
    <execution>
      <phase>compile</phase>
      ...
    </execution>
  </executions>
</plugin>
<plugin>
  <artifactId>maven-plugin-1</artifactId>
  <version>1.0</version>
  <executions>
    <execution>
      <phase>process-resources</phase>
      ...
    </execution>
  </executions>
</plugin> 
Run Code Online (Sandbox Code Playgroud)
  1. 如果多次执行具有相同的相位,然后执行将内置一个第一个(如Maven的编译器插件)ID为默认- 东西,那么其他的执行将在它们出现的顺序你的pom文件.

例如,如果你在pom的某个地方有这个

        <plugin>
            <artifactId>maven-plugin-1</artifactId>
            <version>1.2.3</version>
            <executions>
                <execution>
                    <id>my-compile</id>
                    <phase>compile</phase>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-plugin-2</artifactId>
            <version>4.5.6</version>
            <executions>
                <execution>
                    <id>my-compile-2</id>
                    <phase>compile</phase>
                </execution>
            </executions>
        </plugin>
Run Code Online (Sandbox Code Playgroud)

在你有效的pom中的任何地方

  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <executions>
      <execution>
        <id>**default-compile**</id>
        <phase>compile</phase>
        <goals>
          <goal>compile</goal>
        </goals>
      </execution>
      ...
    </executions>
  </plugin>
Run Code Online (Sandbox Code Playgroud)

然后maven-compiler-plugin将执行maven-compiler-plugin,然后是maven-plugin-1和maven-plugin-2.

如果你想要maven-compiler-plugin:编译目标在maven-plugin-1之后执行,那么你可以这样做

<plugin>
    <artifactId>maven-plugin-1</artifactId>
    <version>1.2.3</version>
    <executions>
        <execution>
            <id>my-compile</id>
            <phase>compile</phase>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <executions>
        <execution>
            <id>something-other-than-**default-compile**</id>
            <phase>compile</phase>
        </execution>
        <execution>
            <id>**default-compile**</id>
            <phase>none</phase>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)