Yoshi.dev

技術系の趣味、またはやった仕事やそこから学んだことを忘れないために

grpc-spring-boot-starter使ってるプロジェクトでdockerビルドしたアプリを動かしたらNoSuchMethodErrorに遭遇した

ちょっとよくわからない現象に遭遇した

grpc-spring-boot-starter使ってるプロジェクトでの話だけど ローカルでgradle bootRunして起動した時はgrpc通信部分で問題なく動くのだが dockerイメージにビルドしてコンテナとして動かしたときに下記のようなエラーがでてきた

Exception in thread "grpc-default-executor-0" java.lang.NoSuchMethodError: 'void com.google.protobuf.AbstractMessageLite$Builder.addAll(java.lang.Iterable, java.util.List)'

依存してるライブラリのバージョンがうまく噛み合ってないのかなと思ったので grpc-spring-boot-starterのrelease note確認して、使用してるバージョンで依存してるgrpc-javaのバージョンを特定してから grpc-javaのREADMEに書いてある必要なgradleの依存ライブラリを明示的に書くようにしたら問題解決した

implementation 'io.grpc:grpc-netty-shaded:1.25.0'
implementation 'io.grpc:grpc-protobuf:1.25.0'
implementation 'io.grpc:grpc-stub:1.25.0'

↑自分はgrpc-spring-boot-starter:3.5.0を使っていたので、grpc-java:1.25.0をgradleに記入した

grpc-spring-boot-starterのREADMEにも特にgrpc-javaの依存を書いておけと見当たらなかったので結構ハマってしまった

ローカルでprotocol buffersのjavaファイルを作るときにはgenerateProtoを使用していて、dockerのイメージをビルドするときも同じコマンドが叩かれている認識なので 生成されるクラスファイルが依存するライブラリのバージョンも同じになるはずだからどの環境で動かしてもこんなエラーには遭遇しないと思ってたんだけど 何か勘違い、見落としがありそうだ.. gradleプロジェクトだとdependenciesタスクで依存してるライブラリのバージョンを確認できるけど、 dockerイメージにするとそのへんを確認する方法がわからなくて困った