You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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时,流程是:

    1. 执行clean阶段
    2. 执行package阶段及其所有前置阶段(validate → compile → test → package),此时maven-shade-plugin会在package阶段替换原始jar包
    3. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:05:02