我是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文件复制到相应的目录。
答案 0 :(得分:38)
因为你说你是Maven的新手.... Maven构建是一系列有序阶段的执行。这些阶段由适合您的项目lifecycle的based 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 :(得分: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>
然后执行是:
答案 2 :(得分:5)
在Maven 3.0.3及更高版本中,有两个规则
例如,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>
例如,如果你在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条规则可以执行插件顺序:
以继承为例:“父POM绑定在子绑定之后执行。”。因此,如果您的插件没有按照您期望的顺序执行(遵循此答案中提到的前两点),那么您应该看看它们是否在父POM中定义。 -Incorrect execution order of plugins in the same phase。
我在任何地方都找不到清晰记录的文件,但是有document the algorithm calculating the order of plugin executions的公开票。