使用maven-shade-plugin的<relocations>功能可重命名冲突依赖包路径,如将org.bouncycastle.改为com.yourcompany.shaded.bc.,新建shading模块单独处理、限定子包范围、验证类路径变更后,主项目直接引入shaded包即可隔离类冲突。

在 Maven 中使用 shade 插件打包并重命名依赖类(即 Relocation),主要是为了解决依赖冲突,或把第三方库“私有化”嵌入到你的 jar 中,避免与宿主环境的同名类冲突。核心是通过 relocations 配置,将原始包路径映射为新路径。
1. 添加 maven-shade-plugin 插件
在 pom.xml 的 <build><plugins> 中加入 shade 插件(推荐使用较新稳定版,如 3.4.1+):
<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>
<!-- 关键:配置 relocation -->
<relocations>
<relocation>
<pattern>com.google.common.</pattern>
<shadedPattern>myapp.shaded.guava.</shadedPattern>
</relocation>
<relocation>
<pattern>org.slf4j.</pattern>
<shadedPattern>myapp.shaded.slf4j.</shadedPattern>
</relocation>
</relocations>
<pre class='brush:java;toolbar:false;'> <!-- 可选:指定主类,生成可执行 jar -->
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.MyApp</mainClass>
</transformer>
</transformers>
<!-- 可选:避免 META-INF 签名冲突 -->
<filters>
<filter>
<artifact>*:*)</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution></executions> </plugin>
2. Relocation 的作用和规则
Relocation 不是简单地“改名文件”,而是:在打包时重写字节码中的类引用、常量池、签名等所有涉及原始包路径的位置,确保运行时加载的是你重命名后的新类。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
pattern 是要匹配的原始包前缀(必须以
.结尾,如com.google.common.) -
shadedPattern 是替换成的新前缀(也建议以
.结尾) - 匹配是前缀匹配,所以
pattern="org.apache.commons.lang3."会重定位org.apache.commons.lang3.StringUtils和其子包下所有类 - 多个 relocation 按声明顺序处理,不支持通配符或正则表达式(仅前缀匹配)
3. 注意事项和常见问题
Relocation 功能强大但容易出错,以下几点务必留意:
立即学习“Java免费学习笔记(深入)”;
- 被 relocation 的依赖必须是
compile或runtime范围 ——provided或test依赖不会被打进 shade jar,自然也不会被重命名 - 某些框架(如 Spring、Logback)会在运行时通过反射或资源加载查找类(如
META-INF/spring.factories、logback.xml中的类名),这些字符串不会被自动重写,需手动修改或使用ResourceTransformer处理 - 若依赖中含 JNI 库或 native 资源,shade 不处理二进制文件路径,relocation 对它们无效
- 建议配合
<minimizeJar>true</minimizeJar>减小体积(慎用,可能误删反射调用的类)
4. 验证 relocation 是否生效
打包完成后(mvn clean package),检查生成的 target/*.jar:
- 用
jar -tvf your-app-1.0.jar | grep guava查看是否出现myapp/shaded/guava/目录 - 反编译一个被 relocation 的类(如
myapp.shaded.guava.base.Preconditions),确认其内部引用的其他 guava 类是否也已变成myapp.shaded.guava.xxx - 运行程序,观察日志或异常堆栈是否显示重命名后的包路径

















