java.lang.NoClassDefFoundError: Could not initialize class io.grpc.netty.NettyClientHandler問題の解決方法


今日、RocketMQコンシューマシステムの改造を行い、Fabricブロックチェーンにメッセージを書く際、コードの作成が完了した後にローカルテストを行う過程で、次のような異常が発生しました(キューから読み込まれたデータが多いため、エラーメッセージも多く、いずれもエラーを報告しています):
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-allnetty-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つの参考を提供します!!!