grpc-netty-shaded 1.65.1构建原生镜像遇ClassNotFoundException求助
gRPC-Netty Shaded 原生镜像构建时BouncyCastleAlpnSslUtils初始化异常问题
环境信息
- gRPC-Java版本:1.65.1
- Spring Boot版本:3.3.1
- Nacos:支持Spring Boot 3.3.1的实验版本
- 引入依赖:grpc-netty-shaded
问题现象
执行native:compile构建原生镜像时,抛出如下异常:
[ForkJoinPool-2-worker-2] ERROR io.grpc.netty.shaded.io.netty.handler.ssl.BouncyCastleAlpnSslUtils -- Unable to initialize BouncyCastleAlpnSslUtils. java.lang.ClassNotFoundException: org.bouncycastle.jsse.BCSSLEngine
原因推测
项目中某个类触发了BouncyCastleAlpnSslUtils的调用,该类在静态初始化阶段通过反射尝试获取BCSSLEngine类,但项目本身并未使用该类,因此触发ClassNotFoundException。
排查信息
Nacos中用到的io.grpc.netty.shaded.io.netty相关类
io.grpc.netty.shaded.io.netty.channel.Channel io.grpc.netty.shaded.io.netty.channel.ChannelHandler io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext io.grpc.netty.shaded.io.netty.handler.ssl.SslContext io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder io.grpc.netty.shaded.io.netty.handler.ssl.util.InsecureTrustManagerFactory io.grpc.netty.shaded.io.netty.handler.ssl.SslProvider io.grpc.netty.shaded.io.netty.handler.ssl.ClientAuth io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder io.grpc.netty.shaded.io.netty.buffer.ByteBuf io.grpc.netty.shaded.io.netty.util.AsciiString
已配置的原生镜像运行时初始化类
<buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.handler.ssl.PemPrivateKey</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.PooledByteBuf</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.PooledUnsafeDirectByteBuf</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.UnpooledHeapByteBuf</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.ByteBufUtil</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.UnpooledDirectByteBuf</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.UnpooledUnsafeDirectByteBuf</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.PooledSlicedByteBuf</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.AbstractPooledDerivedByteBuf</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.ByteBufAllocator</buildArg> <buildArg>--initialize-at-run-time=io.grpc.netty.shaded.io.netty.handler.ssl.PemValue</buildArg>
尝试过的方案及结果
曾尝试添加org.bouncycastle相关依赖解决BCSSLEngine的ClassNotFoundException,但触发了新异常:
[main] ERROR io.grpc.netty.shaded.io.netty.handler.ssl.BouncyCastleAlpnSslUtils -- Unable to initialize BouncyCastleAlpnSslUtils. java.security.NoSuchProviderException: no such provider: BCJSSE
因此放弃该方案。已确认Nacos并未直接调用BouncyCastleAlpnSslUtils的相关方法,验证了之前的推测。
恳请熟悉gRPC的开发者提供解决方案,感谢!
内容的提问来源于stack exchange,提问作者CN Dioxide
相关产品推荐
相关产品推荐

