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 依赖产生冲突。



什么是 Shaded 技术?插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2025/11/05/shaded/