quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.49k stars 2.59k forks source link

NoClassDefFoundError when use a self-provided PostgreSQL authentication plugin #28220

Open saragluna opened 1 year ago

saragluna commented 1 year ago

Describe the bug

I'm running this sample hibernate-orm-panache-quickstart, but with a self-provided authentication plugin from azure-identity-providers-jdbc-postgresql.

The application can run correctly when use the prod profile, but when dev is being used, it will throw a NoClassDefFoundException

2022-09-27 19:43:46,950 WARN  [rea.cor.Exceptions] (ForkJoinPool.commonPool-worker-9) throwIfFatal detected a jvm fatal exception, which is thrown and logged below:: java.lang.NoClassDefFoundError: com/sun/jna/Platform
    at com.azure.identity.implementation.IntelliJCacheAccessor.getIntelliJCredentialsFromIdentityMsalCache(IntelliJCacheAccessor.java:71)
    at com.azure.identity.implementation.IdentityClient.authenticateWithIntelliJ(IdentityClient.java:436)
    at com.azure.identity.IntelliJCredential.lambda$getToken$2(IntelliJCredential.java:88)
    at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)
    at reactor.core.publisher.Mono.subscribe(Mono.java:4397)
    at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:82)
    at reactor.core.publisher.Operators.complete(Operators.java:137)
    at reactor.core.publisher.MonoEmpty.subscribe(MonoEmpty.java:46)
    at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
    at reactor.core.publisher.Mono.subscribe(Mono.java:4397)
    at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:426)
    at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:272)
    at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:230)
    at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:790)
    at reactor.core.publisher.FluxFlatMap$FlatMapMain.innerComplete(FluxFlatMap.java:894)
    at reactor.core.publisher.FluxFlatMap$FlatMapInner.onComplete(FluxFlatMap.java:997)
    at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:2058)
    at reactor.core.publisher.Operators.complete(Operators.java:137)
    at reactor.core.publisher.MonoEmpty.subscribe(MonoEmpty.java:46)
    at reactor.core.publisher.Mono.subscribe(Mono.java:4397)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
    at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:234)
    at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:258)
    at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onError(FluxPeekFuseable.java:903)
    at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onError(FluxMap.java:265)
    at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:2063)
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:192)
    at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:259)
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:142)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
    at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
    at reactor.core.publisher.MonoCompletionStage.lambda$subscribe$0(MonoCompletionStage.java:83)
    at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
    at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
    at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1705)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1692)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)

Expected behavior

No exception thrown when running locally.

Actual behavior

The application throws NoClassDefFoundException.

How to Reproduce?

Add the following dependency to the pom.xml file

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-identity-providers-jdbc-postgresql</artifactId>
  <version>1.0.0-beta.1</version>
</dependency>

Output of uname -a or ver

Darwin 22.1.0 Darwin Kernel Version 22.1.0: Mon Aug 15 20:06:40 PDT 2022; root:xnu-8792.40.29.161.2~1/RELEASE_ARM64_T8103 arm64

Output of java -version

openjdk version "11.0.15" 2022-04-19 LTS OpenJDK Runtime Environment Zulu11.56+19-CA (build 11.0.15+10-LTS) OpenJDK 64-Bit Server VM Zulu11.56+19-CA (build 11.0.15+10-LTS, mixed mode)

GraalVM version (if different from Java)

openjdk version "11.0.14" 2022-01-18 OpenJDK Runtime Environment GraalVM CE 22.0.0.2 (build 11.0.14+9-jvmci-22.0-b05) OpenJDK 64-Bit Server VM GraalVM CE 22.0.0.2 (build 11.0.14+9-jvmci-22.0-b05, mixed mode, sharing)

Quarkus version or git rev

2.12.1.Final

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

Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)

Additional information

Specifying parentFirstArtifact using this method https://quarkus.io/guides/class-loading-reference#parent-first-dependencies won't work. I ended up adding something like this

%dev.quarkus.class-loading.parent-first-artifacts=com.azure:azure-core::jar,\
  com.azure:azure-core-http-netty::jar,\
  io.projectreactor.netty:reactor-netty-core::jar,\
  io.projectreactor.netty:reactor-netty-http::jar,\
  io.netty:netty-resolver-dns::jar,\
  io.netty:netty-codec::jar,\
  io.netty:netty-codec-http::jar,\
  io.netty:netty-codec-http2::jar,\
  io.netty:netty-handler::jar,\
  io.netty:netty-resolver::jar,\
  io.netty:netty-common::jar,\
  io.netty:netty-transport::jar,\
  io.netty:netty-buffer::jar,\
  com.azure:azure-identity::jar,\
  com.azure:azure-identity-providers-core::jar,\
  com.azure:azure-identity-providers-jdbc-postgresql::jar,\
  com.fasterxml.jackson.core:jackson-core::jar,\
  com.fasterxml.jackson.core:jackson-annotations::jar,\
  com.fasterxml.jackson.core:jackson-databind::jar,\
  com.fasterxml.jackson.dataformat:jackson-dataformat-xml::jar,\
  com.fasterxml.jackson.datatype:jackson-datatype-jsr310::jar,\
  org.reactivestreams:reactive-streams::jar,\
  io.projectreactor:reactor-core::jar,\
  com.microsoft.azure:msal4j::jar,\
  com.microsoft.azure:msal4j-persistence-extension::jar,\
  org.codehaus.woodstox:stax2-api::jar,\
  com.fasterxml.woodstox:woodstox-core::jar,\
  com.nimbusds:oauth2-oidc-sdk::jar,\
  com.nimbusds:content-type::jar,\
  com.nimbusds:nimbus-jose-jwt::jar,\
  net.minidev:json-smart::jar,\
  net.minidev:accessors-smart::jar,\
  io.netty:netty-transport-native-unix-common::jar,\
  net.java.dev.jna:jna::jar

Since there're so many transitive dependencies, I have to add them one by one.

quarkus-bot[bot] commented 1 year ago

/cc @Sanne, @barreiro, @gsmet

gsmet commented 1 year ago

@agoncal I'm wondering if you could have a look at this one?

agoncal commented 1 year ago

@saragluna I cannot reproduce the bug. I can use the app in dev mode (I am using the latest 2.15.3 version though).

@saragluna Tell me what you do exactly ? You just add the azure-identity-providers-jdbc-postgresql dependency to the pom.xml (leaving the existing quarkus-jdbc-postgresql dependency) and execute mvn quarkus:dev and you get the exception ?

saragluna commented 1 year ago

Hi @agoncal, this is the sample I ran https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps/tree/main/Quarkus. I specify the auth plugin in the JDBC URL for the driver to load the authentication plugin.

marko-bekhta commented 5 months ago

Hey @saragluna I was trying to reproduce this issue with no success. Could you please provide a reproducer (just a simple Quarkus app where the issue is visible) or maybe confirm that this is no longer an issue with the latest Quarkus release? Thanks!

saragluna commented 5 months ago

Hi @marko-bekhta, I will try to run it again.

marko-bekhta commented 5 months ago

Thanks!