java.lang.NoClassDefFoundError: Could not initialize class io.grpc.netty.NettyClientHandler問題の解決方法
今日、RocketMQコンシューマシステムの改造を行い、Fabricブロックチェーンにメッセージを書く際、コードの作成が完了した後にローカルテストを行う過程で、次のような異常が発生しました(キューから読み込まれたデータが多いため、エラーメッセージも多く、いずれもエラーを報告しています):
NoClassDefFoundErrorというエラーを見て、まずjarパッケージが欠けていると考え、検索してから対応するioがあることを発見した.grpc.Nettyパッケージ依存;次に,単一jarパケットバージョンの競合問題と考え,grpc-nettyパケットをpomファイルに単独で最新バージョンに導入したが,依然として問題は解決されていないことが分かった.多くの
最初は
java.lang.NoClassDefFoundError: Could not initialize class io.grpc.netty.NettyClientHandler
at io.grpc.netty.NettyClientTransport.start(NettyClientTransport.java:174)
at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:29)
at io.grpc.internal.InternalSubchannel.startNewTransport(InternalSubchannel.java:202)
at io.grpc.internal.InternalSubchannel.obtainActiveTransport(InternalSubchannel.java:175)
at io.grpc.internal.ManagedChannelImpl$SubchannelImplImpl.obtainActiveTransport(ManagedChannelImpl.java:813)
at io.grpc.internal.GrpcUtil.getTransportFromPickResult(GrpcUtil.java:578)
at io.grpc.internal.DelayedClientTransport.reprocess(DelayedClientTransport.java:280)
at io.grpc.internal.ManagedChannelImpl$LbHelperImpl$5.run(ManagedChannelImpl.java:719)
at io.grpc.internal.ChannelExecutor.drain(ChannelExecutor.java:72)
at io.grpc.internal.ManagedChannelImpl$LbHelperImpl.runSerialized(ManagedChannelImpl.java:710)
at io.grpc.internal.ManagedChannelImpl$NameResolverListenerImpl.onAddresses(ManagedChannelImpl.java:759)
at io.grpc.internal.DnsNameResolver$1.run(DnsNameResolver.java:176)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
NoClassDefFoundErrorというエラーを見て、まずjarパッケージが欠けていると考え、検索してから対応するioがあることを発見した.grpc.Nettyパッケージ依存;次に,単一jarパケットバージョンの競合問題と考え,grpc-nettyパケットをpomファイルに単独で最新バージョンに導入したが,依然として問題は解決されていないことが分かった.多くの
java.lang.NoClassDefFoundError: Could not initialize class io.grpc.netty.NettyClientHandler
の異常情報の中でよく調べたところ、中にはもう一つの異常情報(異常が多すぎる...):java.lang.NoSuchMethodError: io.netty.handler.codec.http.HttpResponseStatus.codeAsText()Lio/netty/util/AsciiString;
at io.netty.handler.codec.http2.Http2ConnectionHandler.(Http2ConnectionHandler.java:72)
at io.grpc.netty.NettyClientTransport.start(NettyClientTransport.java:174)
at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:29)
at io.grpc.internal.InternalSubchannel.startNewTransport(InternalSubchannel.java:202)
at io.grpc.internal.InternalSubchannel.obtainActiveTransport(InternalSubchannel.java:175)
at io.grpc.internal.ManagedChannelImpl$SubchannelImplImpl.obtainActiveTransport(ManagedChannelImpl.java:813)
at io.grpc.internal.GrpcUtil.getTransportFromPickResult(GrpcUtil.java:578)
at io.grpc.internal.DelayedClientTransport.reprocess(DelayedClientTransport.java:280)
at io.grpc.internal.ManagedChannelImpl$LbHelperImpl$5.run(ManagedChannelImpl.java:719)
at io.grpc.internal.ChannelExecutor.drain(ChannelExecutor.java:72)
at io.grpc.internal.ManagedChannelImpl$LbHelperImpl.runSerialized(ManagedChannelImpl.java:710)
at io.grpc.internal.ManagedChannelImpl$NameResolverListenerImpl.onAddresses(ManagedChannelImpl.java:759)
at io.grpc.internal.DnsNameResolver$1.run(DnsNameResolver.java:176)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
最初は
io.netty.handler.codec.http
パックの問題だと思っていましたが、後にこのパックの中にもHttpResponseStatus.codeAsText()
という方法があるのを見て、java.lang.NoSuchMethodError
の異常は起こらないはずですが、後のio/netty/util/AsciiString
が問題点だと感じました.私の依存パックの中にio/netty/util
というパックがそれぞれnetty-all
とnetty-common
パックに現れているのが見つかりました.よく調べてみると、netty-all
パックの中にio/netty/util/AsciiString
パックが入っていないことがわかりました.ここで、netty-all
パケットがrocketmq-client-4.3.2
パケットに導入するバージョン番号が4.0.42であるため、問題はついに特定する.Final,netty-common
は4.1.12である.Finalバージョンでは、netty-all
パケットがpomファイルの前面にあるため、netty-all
パケットのうちio/netty/util
パケットが有効となり、AsciiStringクラスが存在しないため、最後の異常が生じる、最終的にはpomファイルにnetty-all
パケットの4.1.12を単独で導入する方法が採用する.Finalバージョンでは、rocketmq-client
パケットからnetty-all
の依存を削除し、最終的にConsumerはキューからデータ情報を取得してアップリンク操作を実行することができます.この問題は一日中私を悩ませて、意外にも2つの異なるjarパッケージがほとんど同じサブパッケージを含むことができることができて、記録して、後の過程のために1つの参考を提供します!!!