quarkusio / quarkus

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

Quarkus 3.7.4 java.lang.ClassNotFoundException when running devsevices with gradle #38990

Closed Malandril closed 7 months ago

Malandril commented 7 months ago

Describe the bug

Quarkus 3.7.4 throws java.lang.ClassNotFoundException: org.apache.commons.codec.Charsets when initializing devservices when using gradle. This does not happen with maven.

Expected behavior

Running gradle quarkusDev start the application in dev mode, and devservices are initialized.

Actual behavior

Running gradle quarkusDev fails with:

24-02-24 16:02:12,927 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
        [error]: Build step io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor#launchDatabases threw an exception: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/commons/codec/Charsets
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.startDevDb(DevServicesDatasourceProcessor.java:361)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.launchDatabases(DevServicesDatasourceProcessor.java:142)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
        at java.base/java.lang.Thread.run(Thread.java:1583)
        at org.jboss.threads.JBossThread.run(JBossThread.java:501)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/codec/Charsets
        at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.<init>(TarArchiveOutputStream.java:212)
        at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.<init>(TarArchiveOutputStream.java:157)
        at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.<init>(TarArchiveOutputStream.java:147)
        at org.testcontainers.containers.ContainerState.copyFileToContainer(ContainerState.java:350)
        at org.testcontainers.containers.ContainerState.copyFileToContainer(ContainerState.java:331)
        at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:986)
        at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:444)
        at org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:357)
        at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:81)
        at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:347)
        at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:333)
        at io.quarkus.devservices.mariadb.deployment.MariaDBDevServicesProcessor$1.startDatabase(MariaDBDevServicesProcessor.java:72)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.startDevDb(DevServicesDatasourceProcessor.java:289)
        ... 10 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.Charsets
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:518)
        at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468)
        ... 23 more

        at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:334)
        at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:251)
        at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:60)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:112)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:433)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:55)
        at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:138)
        at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:93)
        at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131)
        at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62)
Caused by: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
        [error]: Build step io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor#launchDatabases threw an exception: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/commons/codec/Charsets
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.startDevDb(DevServicesDatasourceProcessor.java:361)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.launchDatabases(DevServicesDatasourceProcessor.java:142)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
        at java.base/java.lang.Thread.run(Thread.java:1583)
        at org.jboss.threads.JBossThread.run(JBossThread.java:501)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/codec/Charsets
        at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.<init>(TarArchiveOutputStream.java:212)
        at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.<init>(TarArchiveOutputStream.java:157)
        at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.<init>(TarArchiveOutputStream.java:147)
        at org.testcontainers.containers.ContainerState.copyFileToContainer(ContainerState.java:350)
        at org.testcontainers.containers.ContainerState.copyFileToContainer(ContainerState.java:331)
        at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:986)
        at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:444)
        at org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:357)
        at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:81)
        at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:347)
        at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:333)
        at io.quarkus.devservices.mariadb.deployment.MariaDBDevServicesProcessor$1.startDatabase(MariaDBDevServicesProcessor.java:72)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.startDevDb(DevServicesDatasourceProcessor.java:289)
        ... 10 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.Charsets
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:518)
        at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468)
        ... 23 more

        at io.quarkus.builder.Execution.run(Execution.java:123)
        at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79)
        at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:160)
        at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:330)
        ... 9 more
Caused by: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/commons/codec/Charsets
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.startDevDb(DevServicesDatasourceProcessor.java:361)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.launchDatabases(DevServicesDatasourceProcessor.java:142)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
        at java.base/java.lang.Thread.run(Thread.java:1583)
        at org.jboss.threads.JBossThread.run(JBossThread.java:501)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/codec/Charsets
        at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.<init>(TarArchiveOutputStream.java:212)
        at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.<init>(TarArchiveOutputStream.java:157)
        at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.<init>(TarArchiveOutputStream.java:147)
        at org.testcontainers.containers.ContainerState.copyFileToContainer(ContainerState.java:350)
        at org.testcontainers.containers.ContainerState.copyFileToContainer(ContainerState.java:331)
        at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:986)
        at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:444)
        at org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:357)
        at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:81)
        at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:347)
        at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:333)
        at io.quarkus.devservices.mariadb.deployment.MariaDBDevServicesProcessor$1.startDatabase(MariaDBDevServicesProcessor.java:72)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.startDevDb(DevServicesDatasourceProcessor.java:289)
        ... 10 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.Charsets
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:518)
        at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468)
        ... 23 more

How to Reproduce?

quarkus create app --gradle-kotlin-dsl -x 'jdbc-mariadb,hibernate-orm-panache' project -P 3.7.4
cd project
./gradlew quarkusDev

Output of uname -a or ver

Linux DESKTOP 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

Output of java -version

openjdk version "21" 2023-09-19 LTS OpenJDK Runtime Environment Temurin-21+35 (build 21+35-LTS) OpenJDK 64-Bit Server VM Temurin-21+35 (build 21+35-LTS, mixed mode, sharing)

Quarkus version or git rev

3.7.4

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

Gradle 8.5

Additional information

No response

quarkus-bot[bot] commented 7 months ago

/cc @glefloch, @quarkusio/devtools

gsmet commented 7 months ago

Not sure what's going on but it seems related to us upgrading Commons Compress (because of a CVE so we don't want to go back) and https://github.com/testcontainers/testcontainers-java/issues/8169 .

Could you prepare a small project reproducing the issue? We probably need to experiment to try to find a workaround.

Thanks!

Malandril commented 7 months ago

Simply creating a project with the quarkus cli is enough to reproduce

quarkus create app --gradle-kotlin-dsl -x 'jdbc-mariadb,hibernate-orm-panache' -P 3.7.4 project-name

I created a project as such here https://github.com/Malandril/quarkus-class-not-found

Then running ./gradlew quarkusDev or quarkus dev by using the quarkus cli produces the error

geoand commented 7 months ago

The odd thing is that the error does not occur in a Maven project...

geoand commented 7 months ago

The current workaround is to include

implementation("commons-codec:commons-codec")

@aloubyansky any idea why we have this difference between Gradle and Maven?

gsmet commented 7 months ago

I was wondering if maybe the Testcontainers update would fix it but didn't have the time to check yet.

geoand commented 7 months ago

I'll give it a shot

geoand commented 7 months ago

According to https://mvnrepository.com/artifact/org.testcontainers/testcontainers/1.19.6 testcotnainers still depends on 1.24 of commons-compress.

geoand commented 7 months ago

Bad news: https://github.com/testcontainers/testcontainers-java/issues/8338#issuecomment-1959081453

gsmet commented 7 months ago

I wonder if we should add commons-codec to the deployment classpath for the time being?

geoand commented 7 months ago

Unless @aloubyansky has another idea, I think we should

aloubyansky commented 7 months ago

I'm not sure what has commons-codec as a dependency so far.

aloubyansky commented 7 months ago

Ok, I see it's an optional dependency commons-compress 1.26, so yes, if we want 1.26 we should add commons-codec as a dependency.

gsmet commented 7 months ago

I created a PR to fix it. It should be part of tomorrow's release.

Thanks a lot for the very detailed report!