为何mvn clean install与mvn clean package install执行结果不同?
为什么
mvn clean install和mvn clean package install执行结果不同? 我使用Maven已有多年,最近遇到一个奇怪的错误:mvn clean install执行成功,但mvn clean package install却失败,报错提示jar:3.3.0:jar (default-jar)任务被重复执行。按Maven文档说明,调用install阶段时会自动执行所有前置必要阶段,那为什么多指定一个package阶段就会出问题?
复现示例
只需使用以下pom.xml即可复现问题:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>mdr-wiremock-shaded</artifactId> <version>1.0.1</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.github.tomakehurst</groupId> <artifactId>wiremock-jre8-standalone</artifactId> <version>2.31.0</version> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <goals> <goal>shade</goal> </goals> <phase>package</phase> <configuration> <relocations> <relocation> <pattern>org.slf4j</pattern> <shadedPattern>shaded.org.slf4j</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
问题原因
Maven的生命周期阶段是按依赖顺序执行的,但当你显式指定多个阶段时,Maven会依次执行每个指定阶段及其所有前置阶段,不会自动去重合并流程:
执行
mvn clean package install时,流程是:- 执行
clean阶段 - 执行
package阶段及其所有前置阶段(validate → compile → test → package),此时maven-shade-plugin会在package阶段替换原始jar包 - 执行
install阶段及其所有前置阶段(validate → compile → test → package → install),这一步会再次触发package阶段,导致maven-jar-plugin尝试重新生成原始jar,但此时shade插件已经修改了输出文件或目录,最终引发任务重复执行的冲突错误
- 执行
而
mvn clean install则是直接触发install阶段,只会按顺序执行一次完整生命周期:clean → validate → compile → test → package → install,每个阶段仅执行一次,因此不会出现冲突。
结论
不要显式指定多个存在依赖关系的生命周期阶段,Maven会自动处理目标阶段的所有前置步骤,多指定反而会导致生命周期重复执行,引发插件执行冲突。
内容的提问来源于stack exchange,提问作者clembo590
相关产品推荐
相关产品推荐

