quarkiverse / quarkus-google-cloud-services

Google Cloud Services Quarkus Extensions
https://docs.quarkiverse.io/quarkus-google-cloud-services/main/index.html
Apache License 2.0
54 stars 33 forks source link

NoClassDefFoundError: io/grpc/internal/AbstractManagedChannelImplBuilder since Quarkus 3.6.0 #547

Closed ghost closed 7 months ago

ghost commented 9 months ago

Describe the bug

The issue is also opened in Quarkus

When trying to update from Quarkus 3.5.3 to 3.6.0, I got this error when connecting to GCP Firestore (using quarkus-google-cloud-firestore:2.6.0):

Caused by: java.lang.NoClassDefFoundError: io/grpc/internal/AbstractManagedChannelImplBuilder
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1013)
    at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:508)
    at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:391)
    at java.base/java.lang.Class.forName(Class.java:382)
    at io.grpc.ManagedChannelRegistry.getHardCodedClasses(ManagedChannelRegistry.java:142)
    at io.grpc.ManagedChannelRegistry.getDefaultRegistry(ManagedChannelRegistry.java:103)
    at io.grpc.ManagedChannelProvider.provider(ManagedChannelProvider.java:43)
    at io.grpc.ManagedChannelBuilder.forAddress(ManagedChannelBuilder.java:44)
    at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createSingleChannel(InstantiatingGrpcChannelProvider.java:353)
    at com.google.api.gax.grpc.ChannelPool.<init>(ChannelPool.java:107)
    at com.google.api.gax.grpc.ChannelPool.create(ChannelPool.java:85)
    at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createChannel(InstantiatingGrpcChannelProvider.java:237)
    at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.getTransportChannel(InstantiatingGrpcChannelProvider.java:231)
    at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:236)
    at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:143)
    at com.google.cloud.firestore.spi.v1.GrpcFirestoreRpc.<init>(GrpcFirestoreRpc.java:127)
    at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreRpcFactory.create(FirestoreOptions.java:88)
    at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreRpcFactory.create(FirestoreOptions.java:80)
    at com.google.cloud.ServiceOptions.getRpc(ServiceOptions.java:564)
    at com.google.cloud.firestore.FirestoreOptions.getFirestoreRpc(FirestoreOptions.java:358)
    at com.google.cloud.firestore.FirestoreImpl.<init>(FirestoreImpl.java:79)
    at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreFactory.create(FirestoreOptions.java:71)
    at com.google.cloud.firestore.FirestoreOptions$DefaultFirestoreFactory.create(FirestoreOptions.java:64)
    at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:544)
    at io.quarkiverse.googlecloudservices.firestore.runtime.FirestoreProducer.firestore(FirestoreProducer.java:44)
    at io.quarkiverse.googlecloudservices.firestore.runtime.FirestoreProducer_ProducerMethod_firestore_oJWwsWBCeOiWXUA6vKpHCCTGQoo_Bean.doCreate(Unknown Source)
    at io.quarkiverse.googlecloudservices.firestore.runtime.FirestoreProducer_ProducerMethod_firestore_oJWwsWBCeOiWXUA6vKpHCCTGQoo_Bean.create(Unknown Source)
    at io.quarkiverse.googlecloudservices.firestore.runtime.FirestoreProducer_ProducerMethod_firestore_oJWwsWBCeOiWXUA6vKpHCCTGQoo_Bean.create(Unknown Source)
    at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:117)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:41)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:38)
    at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:32)
    at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
    at io.quarkus.arc.impl.ComputingCacheContextInstances.computeIfAbsent(ComputingCacheContextInstances.java:18)
    at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:38)
    at io.quarkiverse.googlecloudservices.firestore.runtime.FirestoreProducer_ProducerMethod_firestore_oJWwsWBCeOiWXUA6vKpHCCTGQoo_Bean.get(Unknown Source)
    at io.quarkiverse.googlecloudservices.firestore.runtime.FirestoreProducer_ProducerMethod_firestore_oJWwsWBCeOiWXUA6vKpHCCTGQoo_Bean.get(Unknown Source)
    ... 11 more

If I switch back to 3.5.3, it's working fine. I don't see anything in the 3.6.0 changelog that ring anything to me.

Expected behavior

No response

Actual behavior

No response

How to Reproduce?

No response

Output of uname -a or ver

No response

Output of java -version

Kotlin 1.9

Quarkus version or git rev

3.6.*

Build tool (ie. output of mvnw --version or gradlew --version)

Gradle 8.4

Additional information

No response

loicmathieu commented 9 months ago

Hi, Can you provide a reproducer project so I can have a look? Even as a repo or a zip attached to this issue.

ghost commented 9 months ago

I will, but I was able to fix it by adding these two libs with lastest versions in my gradle build file:

implementation("com.google.api:gax-grpc:2.38.0")
implementation("io.grpc:grpc-netty:1.60.1")

https://github.com/quarkusio/quarkus/issues/37806#issuecomment-1864180569

loicmathieu commented 9 months ago

Good to know, I just update to the latest GCP libraries BOM, it would probably fix the issue but if you have a reproducer I would be able to verify this.