maven-shade-plugin通过relocation重命名冲突包实现物理隔离,如将org.bouncycastle.改为com.yourcompany.shaded.bc.,自动更新引用并打包为独立jar,避免版本互斥导致的功能失效。

当项目中两个依赖都引入了同名包、同名类,但版本互不兼容(比如 bcprov-jdk15on 低版和高版共存),单纯 exclude 或升级/降级都会导致某一方功能失效——这时就得靠 maven-shade-plugin 的 relocation(重定位) 功能,把其中一个依赖的包路径彻底改掉,实现物理隔离。
明确重命名目标:先定位冲突点
不是所有包都需要重命名,只动真正冲突的部分。常用手段是:
- 运行
mvn dependency:tree | grep -A 5 -B 5 "bcprov\|poi\|fastjson",确认哪些依赖拉入了冲突 jar; - 检查报错堆栈,看具体是哪个类加载失败或方法找不到,反推其全限定名(如
org.bouncycastle.crypto.params.RSAKeyParameters); - 对比两个 jar 的
META-INF/MANIFEST.MF或反编译 class,确认是否真有同包同名类。
配置 relocation 规则:精准替换包路径
在独立的 shading module(比如 shaded-bcprov)中配置 maven-shade-plugin,关键在 <relocations> 节点:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 指定原包名前缀(
<pattern>org.bouncycastle.</pattern>); - 指定新包名前缀(
<shadedPattern>com.yourcompany.shaded.bc.</shadedPattern>); - 可加
<includes>限定仅重命名特定子包(如crypto.*),避免误动无关类; - 插件会自动更新所有引用该包的 import 语句、字节码中的常量池,无需手动改源码。
打包并验证新 jar 是否可用
执行 mvn clean package 后,生成的 jar 包里:
立即学习“Java免费学习笔记(深入)”;
- 原
org.bouncycastle.crypto.*类已变成com.yourcompany.shaded.bc.crypto.*; - 依赖它的代码(如 Hutool 中调用 BC 的部分)已被自动重写为导入新路径;
- 用
jar -tf target/*.jar | grep shaded.bc检查重命名是否生效; - 将新 jar 作为依赖引入主项目,确保原冲突依赖仍保留(不 exclude),二者不再抢同一个类加载器路径。
注意事项:避开常见坑
重命名不是万能胶,要注意边界:
- 不要重命名 JDK 自带类(如
java.*、javax.*)或核心框架类(如org.springframework.*),会导致 ClassLoader 异常; - 含
ServiceLoader机制的 jar(如 JDBC 驱动、SLF4J 实现),需配合ServicesResourceTransformer合并META-INF/services文件; - 若被重命名的包里有 native 方法或 JNI 调用,需同步检查 so/dll 文件路径是否适配;
- 重命名后,调试时注意 IDE 可能无法关联源码——需额外配置 shaded jar 的 sources jar 或映射规则。

















