M1版MacBook Pro用Java8运行Netty报UnsatisfiedLinkError如何解决
问题原因
该报错是因为当前项目引入的gRPC Shaded包内置的Netty TCNative原生库,没有适配Apple M系列芯片(arm64/aarch64架构)的macOS版本二进制文件。Intel芯片的Mac为x86_64架构,旧版本TCNative默认仅提供x86_64架构的macOS动态库,因此同项目在Intel设备上可正常运行,在M1设备上会抛出找不到对应架构本地库的错误。
排查解决步骤
- 优先升级依赖版本
2.0.46.Final及以上版本的netty-tcnative-boringssl-static正式支持Apple Silicon架构,对应gRPC生态中,io.grpc:grpc-netty-shaded从1.41.0版本开始内置了适配M1芯片的TCNative二进制。如果当前项目使用的gRPC版本低于1.41.0,直接将gRPC版本升级到1.41.0及以上即可解决绝大多数场景的问题。 - 排查依赖冲突
如果已经使用了符合版本要求的依赖仍报错,需要排查是否存在依赖版本覆盖问题:- Maven项目执行
mvn dependency:tree,Gradle项目执行./gradlew dependencies,在输出结果中搜索tcnative相关依赖 - 如果存在其他第三方组件引入了低于支持版本的TCNative依赖,在对应依赖项中排除低版本TCNative,强制项目统一使用支持aarch64架构的版本即可
- Maven项目执行
- 临时兼容方案(不推荐长期使用)
如果暂时无法升级项目依赖,可以在M1设备上安装x86_64版本的OpenJDK 8,通过Rosetta 2转译运行服务,此时JVM识别到的系统架构为x86_64,可匹配原有Intel版本的TCNative库正常运行,但转译模式会带来一定的性能损耗。 - 架构匹配检查
执行java -version确认当前安装的JDK架构:如果是原生aarch64版本的OpenJDK 8,需要搭配带aarch64二进制的TCNative版本;如果是x86版本的JDK运行在Rosetta下,则需要x86_64版本的TCNative库,二者架构不匹配也会触发同类报错。
触发问题的核心报错信息:
java.lang.UnsatisfiedLinkError: no io_grpc_netty_shaded_netty_tcnative_osx_aarch_64 in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
内容的提问来源于stack exchange,提问作者Amit Gawali
相关产品推荐
相关产品推荐

