7

Play 2.5.0 は Netty 4.0.33 を使用しますが、gRPC は Netty 4.1.0 (http2 サポート用) を必要とするため、次の例外が発生します。

[error] p.c.s.n.PlayRequestHandler - Exception caught in Netty
java.lang.AbstractMethodError: null
    at io.netty.util.ReferenceCountUtil.touch(ReferenceCountUtil.java:73)
    at io.netty.channel.DefaultChannelPipeline.touch(DefaultChannelPipeline.java:84)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:154)
    at com.typesafe.netty.http.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:131)
    at com.typesafe.netty.http.HttpStreamsServerHandler.channelRead(HttpStreamsServerHandler.java:96)
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83)
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:154)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:154)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83)
[error] p.c.s.n.PlayRequestHandler - Exception caught in Netty
java.util.NoSuchElementException: http-handler-body-publisher
    at io.netty.channel.DefaultChannelPipeline.getContextOrDie(DefaultChannelPipeline.java:1050)
    at io.netty.channel.DefaultChannelPipeline.remove(DefaultChannelPipeline.java:379)
    at com.typesafe.netty.http.HttpStreamsHandler.handleReadHttpContent(HttpStreamsHandler.java:191)
    at com.typesafe.netty.http.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:167)
    at com.typesafe.netty.http.HttpStreamsServerHandler.channelRead(HttpStreamsServerHandler.java:96)
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83)
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:154)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:154)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83)

すべての gRPC コードを削除すると、再び機能します。

今すぐ試すことができる簡単な修正方法はありますか? ありがとう!

4

3 に答える 3

12

編集:

Play 2.6.0 がリリースされ、Netty 4.1 を使用しています。

tl;dr

Play 2.5.0 と gRPC は、Netty 4 と Netty 4.1 の間のバイナリ非互換性のため、互換性がありません。


Play 2.5.0 では動作せず、Play 2.4.0 では動作する理由は次のとおりです。

Play 2.5.0 は、次のように ( netty-reactive-streams バージョン 1.0.24.0.33.Finalを介して推移的に) 宣言される Netty バージョン を使用します。

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-handler</artifactId>
    <version>4.0.33.Final</version>
</dependency>
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-codec-http</artifactId>
    <version>4.0.33.Final</version>
</dependency>

バージョンは、 async-http-clientによって推移的に追加4.0.33.Finalされたバージョンによって削除されます。これらは Play 2.5.0 で使用される netty 依存関係です:4.0.34.Final

io.netty:netty-buffer:4.0.34.Final
io.netty:netty-codec-http:4.0.34.Final
io.netty:netty-codec:4.0.34.Final
io.netty:netty-common:4.0.34.Final
io.netty:netty-handler:4.0.34.Final
io.netty:netty-transport:4.0.34.Final

一方、Play 2.4.6 では、次の netty 依存関係のみが必要です。

io.netty:netty:3.8.0.Final

したがって、Play 2.5.0 は多くの小さな netty パッケージに依存していますが、Play 2.4.6 は単一の netty パッケージに依存しています。これは、Netty 4がプロジェクト構造を変更してプロジェクトを複数のサブプロジェクトに分割し、ユーザーが Netty から必要な機能だけを追加できるようにしたためです。そしてさらに重要なことに、「Netty のパッケージ名が org.jboss.netty から io.netty に変更されました」。

これらの変更が両方ともここに関係するのはなぜですか?

  1. gRPC は依存関係を必要としないため、gRPC と 2.4.6 の間に依存関係の競合はありませんio.netty:netty。そのため、立ち退きはありません。
  2. org.jboss.nettyクラスには異なるパッケージ名 (およびio.netty) があり、完全修飾名が異なるため、クラス レベルでの競合はありません。したがって、それらは異なるクラスとして扱われます。

Netty 4 と Netty 4.1 は両方とも同じ依存関係を持ちartifactId(その後 4.1 バージョンは 4.0.34 を削除)、 Play 2.5.0 と競合します。これは、これら 2 つのバージョン間で完全修飾クラス名が同じであるため、バイナリの非互換性が発生するためです。

gRPC と Play 2.5.0 を現在 Netty で連携させる方法はないと言うのは長い説明です。Akka HTTP サーバー バックエンドを使用することにした場合でも、Play WS と競合する可能性があります。

于 2016-03-07T15:12:09.403 に答える
0

また、maven-shade-plugin を使用して netty パッケージ名を再配置し、以前のバージョンと競合しないようにすることもできます。

https://github.com/couchbase/couchbase-jvm-coreの例については、couchbase jvm コア ライブラリをご覧ください。

于 2017-04-06T11:34:41.513 に答える