更改maven插件执行的顺序

时间:2011-11-23 14:34:13

标签: 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文件复制到相应的目录。

4 个答案:

答案 0 :(得分:38)

因为你说你是Maven的新手.... Maven构建是一系列有序阶段的执行。这些阶段由适合您的项目lifecyclebased on its packaging确定。

因此,当<{3}}执行插件的目标时,控制

希望有所帮助。

编辑:此外,由于Maven 3.0.3,对于绑定到同一阶段的两个插件,执行顺序与您<的顺序相同em> define 他们。例如:

<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>

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

  1. maven-plugin-3(generate-resources)
  2. maven-plugin-1(process-resources)
  3. maven-plugin-2(process-resources)

答案 1 :(得分:10)

同一阶段的插件按声明的顺序执行。

在pom hierachy的情况下,你必须将父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>

Child 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>

然后执行是:

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

答案 2 :(得分:5)

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

  1. 插件执行按其阶段排序。看到 https://maven.apache.org/ref/current/maven-core/lifecycles.html 阶段的顺序。
  2. 例如,mavin-plugin-1在maven-plugin-2之前执行 因为流程资源阶段被定义为之前发生的 编译阶段。

    <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> 
    
    1. 如果多个执行具有相同的阶段,则第一个执行 执行将是内置的(例如maven-compiler-plugin),其id 默认 - 某事 ,然后其他执行将在 订购它们会出现在您的pom文件中。
    2. 例如,如果你在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>
      

      这就是你有效的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>
      

      然后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>
      

答案 3 :(得分:1)

这可能是一个古老的问题,提供的答案是正确的,只是增加了一个关于继承的问题,因为我发现自己处在这种情况下,无法解决。

在没有提供继承的情况下,似乎有2条规则可以执行插件顺序:

  1. 插件绑定到的阶段按照文档中提供的顺序执行:请参见Introduction to the Build Lifecycle上的“默认生命周期” 插件执行根据其阶段进行排序。
  2. “在Maven 2.0.5及更高版本中,绑定到阶段的多个目标将按照在POM中声明的顺序执行,但是不支持同一插件的多个实例。同一插件的多个实例分组在一起执行,并在Maven 2.0.11及更高版本中排序”-source

以继承为例:“父POM绑定在子绑定之后执行。”。因此,如果您的插件没有按照您期望的顺序执行(遵循此答案中提到的前两点),那么您应该看看它们是否在父POM中定义。 -Incorrect execution order of plugins in the same phase

我在任何地方都找不到清晰记录的文件,但是有document the algorithm calculating the order of plugin executions的公开票。