
本文详解为何 maven-shade-plugin 未生效的根本原因——误将插件声明置于 中,而非实际启用的 节点,并提供完整、可运行的配置示例与关键注意事项。
本文详解为何 `maven-shade-plugin` 未生效的根本原因——误将插件声明置于 `
在使用 Maven 构建可执行的“Fat JAR”(即包含所有依赖的单体 JAR)时,maven-shade-plugin 是最常用且功能强大的选择。但许多开发者会遇到一个典型问题:执行 mvn package 后,输出的仍是普通 JAR(由 maven-jar-plugin 生成),而非预期的 shaded JAR——控制台日志甚至显示 maven-jar-plugin:2.4:jar (default-jar) 被触发,而 shade 插件完全静默。
根本原因并非插件版本冲突或生命周期绑定错误,而是 Maven 的配置作用域误解:
以下是以 simple-client 模块为例的正确配置方式(已修正原始问题):
<build><finalname>Server</finalname><!-- ✅ 正确位置:plugins → 实际启用插件 --><plugins><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></build>
? 验证是否生效? 执行 mvn clean package -X | grep -i "shade",应看到类似 Executing org.apache.maven.plugins:maven-shade-plugin:3.4.1:shade 的日志;生成的 JAR 文件大小显著增大(含依赖),且可通过 java -jar Server.jar 直接运行。
关键注意事项:
- ✅ 勿混淆
与 :前者是“模板”,后者是“实例”。多模块项目中,常在父 POM 的中统一管理 shade 插件版本,再在子模块 中显式引用(无需重复写 和 ); - ✅ 确保
与 :匹配 package +shade 是标准组合,覆盖默认 jar 阶段输出; - ⚠️ 避免 maven-jar-plugin 干扰:如需彻底禁用默认 JAR 生成(仅保留 shaded JAR),可在同一
块中添加 maven-jar-plugin 并设 true ,但通常非必需; - ? finalName 影响输出文件名:上述配置生成 Server.jar,而非默认的 simple-client-1.0-SNAPSHOT.jar,便于部署识别。
总结:Maven 构建逻辑严格遵循配置层级与作用域规则。解决 “Shade 插件不执行” 问题,核心在于理解










