什么是 Shaded 技术?
Shaded 技术通常与构建工具(例如 Maven、Gradle 等)配合使用,在构建过程中对项目依赖的库进行 重定位和封装,生成一个包含依赖的 “Fat JAR”(脂肪包)。与此同时,Shaded 技术还可以对依赖的包或类进行 包名重写(relocation),以防止这些依赖和外部项目的依赖冲突。
在 Java 生态系统中,不同的库可能会依赖 相同的第三方库但版本不同,这就可能导致 “类冲突问题”。通过 Shaded 技术,开发者可以在打包时重命名依赖的包,从而避免冲突。
示例:
假如你的项目中使用了 nacos-client,而你的业务代码恰好也使用了 gRPC 并引入了一个不同的版本的 gRPC。因为 Java 的类加载机制会在运行时加载类文件,但只允许加载一次,这种情况下两个不同的 gRPC 版本的代码可能会互相冲突。使用 Shaded 技术,可以把 nacos-client 中包含的 gRPC 重命名到一个独立的包路径下(通常是加上前缀,比如 com.alibaba.nacos.shaded.io.grpc.*),从而避免冲突。
Shaded 技术的两大功能:
- 依赖封装:将项目依赖的第三方库打包到自己生成的 JAR 文件中。
- 包路径重定位:对 JAR 文件内的依赖使用新的包路径,避免用户的其他依赖或类的包重名导致冲突。
实现 Shaded 技术的工具
- Maven Shade Plugin: Maven 中可以使用
maven-shade-plugin实现 Shaded 技术。通过此插件,可以定制如何重命名依赖,以及将依赖的类打包到主项目的 JAR 文件中。常见的maven-shade-plugin示例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>io.grpc</pattern>
<shadedPattern>com.alibaba.nacos.shaded.io.grpc</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
- Gradle Shadow Plugin: Gradle 中也有类似的工具,比如
shadow插件,功能类似于 Maven 的 shade 插件,能够实现重定位功能。示例配置:
shadowJar {
relocate 'io.grpc', 'com.alibaba.nacos.shaded.io.grpc'
}
Shaded 技术对 nacos-client 的影响
在 Nacos Java SDK 2.x 版本以后,gRPC 被引入作为默认通信方式。为了解决 gRPC 的版本冲突问题,nacos-client 使用 Shaded 技术将其依赖的 gRPC 库进行打包和包名重定位,因此不管用户的项目中是否有 gRPC 相关依赖,都不会影响到 nacos-client 的正常工作。但这也导致原 nacos-client JAR 包的体积增大,因为它将 gRPC 等依赖也打包进去了。
使用纯净版的 nacos-client 的影响
如果你要使用纯净版的 nacos-client(即没有打包 gRPC 依赖的版本),你就需要手动引入 gRPC(以及其他相关依赖),并确保你的 gRPC版本和 nacos-server 的兼容性。否则,通信会中断。
总结:
“Shaded 技术” 是一种依赖处理机制,将某些依赖打包并在名字空间上进行隔离,避免版本冲突的影响。在 nacos-client 中,gRPC 被 Shaded 的目的正是为了防止用户项目中引入的 gRPC 依赖产生冲突。

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接