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

Maven多模块构建fat jar时为何默认用maven-jar-plugin而非shade插件?

Maven打包未触发maven-shade-plugin,默认执行maven-jar-plugin的原因

问题描述

我需要用Maven构建两个依赖于第三个模块的项目,将每个模块打包成独立的fat jar。但执行mvn package时,系统没有调用maven-shade-plugin,反而默认执行了maven-jar-plugin:2.4:jar(default-jar),我并没有在任何地方配置这个插件,这是为什么?

父项目POM

<groupId>com.firstproject.myapp</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<name>Player Communication Parent Project</name>

<modules>
  <module>simple-message</module>
  <module>simple-client</module>
  <module>simple-server</module>
</modules>

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

<dependencies>

</dependencies>

<build>
 
</build>

</project>

simple-client模块POM

<build>
    <finalName>Server</finalName>
    <pluginManagement>
      <plugins>
        <!-- Maven JAR Plugin for TCPServer -->
      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.4.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>com.firstproject.myapp.AppServer</mainClass>
                        </transformer>
                    </transformers>
                        <minimizeJar>false</minimizeJar>
                        <createDependencyReducedPom>false</createDependencyReducedPom>
                        <dependencyReducedPomLocation>
                            ${java.io.tmpdir}/dependency-reduced-pom.xml
                        </dependencyReducedPomLocation>
                        <relocations>
                            <relocation>
                                <pattern>com.firstproject.myapp</pattern>
                                <shadedPattern>hidden.coyote</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
              </execution>
            </executions>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

原因分析

  • maven-jar-plugin是Maven默认绑定插件:对于jar打包类型的模块,Maven的package生命周期阶段会默认绑定maven-jar-plugin的jar目标,这是Maven内置的生命周期规则,无需手动配置就会执行。
  • pluginManagement仅做配置声明,不实际执行:你把maven-shade-plugin放在了<pluginManagement>标签内,这个标签的作用是统一管理插件的版本、配置模板,不会让插件实际参与构建流程。只有将插件直接放在<build><plugins>节点下,Maven才会在对应生命周期阶段执行该插件的目标。

解决方案

修改simple-client模块的POM,将maven-shade-plugin从<pluginManagement>中移出,直接放到<build><plugins>节点下:

<build>
    <finalName>Server</finalName>
    <!-- 若需统一管理插件版本,可保留pluginManagement;无需则可移除 -->
    <pluginManagement>
      <plugins>
        <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-shade-plugin</artifactId>
              <version>3.4.1</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <!-- 此处为实际启用插件的配置 -->
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>com.firstproject.myapp.AppServer</mainClass>
                        </transformer>
                    </transformers>
                        <minimizeJar>false</minimizeJar>
                        <createDependencyReducedPom>false</createDependencyReducedPom>
                        <dependencyReducedPomLocation>
                            ${java.io.tmpdir}/dependency-reduced-pom.xml
                        </dependencyReducedPomLocation>
                        <relocations>
                            <relocation>
                                <pattern>com.firstproject.myapp</pattern>
                                <shadedPattern>hidden.coyote</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
              </execution>
            </executions>
        </plugin>
    </plugins>
  </build>

若不需要统一管理插件版本,也可直接将整个插件配置放到<plugins>下,删除pluginManagement中的对应内容。修改后执行mvn package,Maven会先执行默认的maven-jar-plugin生成普通jar,再执行maven-shade-plugin的shade目标生成包含依赖的fat jar。


内容的提问来源于stack exchange,提问作者flying_kaktus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:53:13