Skip to content

Quarkus 3.22: Test classes w/ superclasses fail with IllegalAccessError #47760

@snazy

Description

@snazy

Describe the bug

We're running into a class-loader issue in Quarkus 3.22.2 (worked fine w/ 3.19.3). Seems to be related to but doesn't look like the same as in #47692.

The issue happens for test classes that extend another class, something like this:

@QuarkusTest
@TestProfile(QuarkusTestProfilePersistInmemory.class)
class TestBasicOperations extends AbstractTestBasicOperations {

...

@ExtendWith(QuarkusNessieClientResolver.class)
abstract class AbstractTestBasicOperations {

TestBasicOperations + AbstractTestBasicOperations
Reproducible via ./gradlew :nessie-quarkus:test --tests TestBasicOperations --info against this branch

(leads to java.lang.IllegalAccessError: class org.projectnessie.server.TestBasicOperations cannot access its abstract superclass ...AbstractTestBasicOperations (...TestBasicOperations is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @9dbb1d9; org.projectnessie.server.AbstractTestBasicOperations is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @e4e1ef5)

If that test class doesn't have a superclass, it works fine. It happens for quite a bunch of tests.

It's also unrelated to our special ThreadPerTestClassExecutionExecutorService - same issue with the "vanilla JUnit engine/executor".

java.lang.ExceptionInInitializerError
java.lang.RuntimeException: java.lang.ExceptionInInitializerError
    at io.quarkus.test.junit.QuarkusTestExtension.throwBootFailureException(QuarkusTestExtension.java:693)
    at io.quarkus.test.junit.QuarkusTestExtension.interceptTestClassConstructor(QuarkusTestExtension.java:791)
    at java.base/java.util.Optional.orElseGet(Optional.java:364)
    at org.projectnessie.junit.engine.ThreadPerTestClassExecutionExecutorService.executeTask(ThreadPerTestClassExecutionExecutorService.java:109)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
    at org.projectnessie.junit.engine.ThreadPerTestClassExecutionExecutorService.invokeAll(ThreadPerTestClassExecutionExecutorService.java:75)
    at org.projectnessie.junit.engine.ThreadPerTestClassExecutionExecutorService.lambda$executeTask$0(ThreadPerTestClassExecutionExecutorService.java:88)
    at java.base/java.lang.Thread.run(Thread.java:1575)
Caused by: java.lang.ExceptionInInitializerError
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:578)
    at java.base/java.lang.Class.forName(Class.java:557)
    at io.quarkus.runner.bootstrap.StartupActionImpl.run(StartupActionImpl.java:294)
    at io.quarkus.test.junit.QuarkusTestExtension.doJavaStart(QuarkusTestExtension.java:232)
    at io.quarkus.test.junit.QuarkusTestExtension.ensureStarted(QuarkusTestExtension.java:660)
    at io.quarkus.test.junit.QuarkusTestExtension.beforeAll(QuarkusTestExtension.java:712)
    ... 2 more
Caused by: java.lang.RuntimeException: Failed to start quarkus
    at io.quarkus.runner.ApplicationImpl.<clinit>(Unknown Source)
    ... 9 more
Caused by: java.lang.IllegalAccessError: class org.projectnessie.server.TestBasicOperations cannot access its abstract superclass org.projectnessie.server.AbstractTestBasicOperations (org.projectnessie.server.TestBasicOperations is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @9dbb1d9; org.projectnessie.server.AbstractTestBasicOperations is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @e4e1ef5)
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1026)
    at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:565)
    at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:523)
    at org.projectnessie.server.TestBasicOperations_Bean.<init>(Unknown Source)
    at io.quarkus.arc.setup.Default_ComponentsProvider.addBeans9(Unknown Source)
    at io.quarkus.arc.setup.Default_ComponentsProvider.getComponents(Unknown Source)
    at io.quarkus.arc.impl.ArcContainerImpl.<init>(ArcContainerImpl.java:129)
    at io.quarkus.arc.Arc.initialize(Arc.java:38)
    at io.quarkus.arc.runtime.ArcRecorder.initContainer(ArcRecorder.java:52)
    at io.quarkus.runner.recorded.ArcProcessor$initializeContainer1770303700.deploy_0(Unknown Source)
    at io.quarkus.runner.recorded.ArcProcessor$initializeContainer1770303700.deploy(Unknown Source)
    ... 10 more

Also seeing another variant that's also related to class-loading for the Renovate-PR for Apache Polaris CI run

We suspect it's related to the test classloading rewrite.

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

No response

Quarkus version or git rev

No response

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

No response

Additional information

No response

Metadata

Metadata

Assignees

Type

No type

Projects

Status

Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions