quarkus: [quarkus-integration-test-jaxb] and others fail with GraalVM master (GraalVM for JDK 22)

Describe the bug

We see some native integration tests failing in our CI. For example IT main, jaxb or spring-web. All of them have a NPE in common:

Exception java.lang.NullPointerException [in thread "main"]
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.getRecognizedProperties(XMLDocumentFragmentScannerImpl.java:764)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.getRecognizedProperties(XMLDocumentScannerImpl.java:449)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.addRecognizedParamsAndSetDefaults(XML11Configuration.java:1518)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.addComponent(XML11Configuration.java:1462)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.<init>(XML11Configuration.java:612)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XIncludeAwareParserConfiguration.<init>(XIncludeAwareParserConfiguration.java:136)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XIncludeAwareParserConfiguration.<init>(XIncludeAwareParserConfiguration.java:93)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.SAXParser.<init>(SAXParser.java:121)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.<init>(SAXParserImpl.java:405)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:137)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:124)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl.newSAXParserImpl(SAXParserFactoryImpl.java:104)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:144)
	at java.xml/javax.xml.catalog.CatalogImpl.getParser(CatalogImpl.java:312)
	at java.xml/javax.xml.catalog.CatalogImpl.parse(CatalogImpl.java:290)
	at java.xml/javax.xml.catalog.CatalogImpl.load(CatalogImpl.java:171)
	at java.xml/javax.xml.catalog.CatalogManager.catalog(CatalogManager.java:73)
	at java.xml/jdk.xml.internal.JdkCatalog.init(JdkCatalog.java:43)
	at java.xml/jdk.xml.internal.XMLSecurityManager.prepareCatalog(XMLSecurityManager.java:305)
	at java.xml/jdk.xml.internal.XMLSecurityManager.<init>(XMLSecurityManager.java:290)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl.<init>(SAXParserFactoryImpl.java:72)
	at java.xml/jdk.xml.internal.JdkXmlUtils.getSAXFactory(JdkXmlUtils.java:441)
	at java.xml/jdk.xml.internal.JdkXmlUtils.<clinit>(JdkXmlUtils.java:97)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.<clinit>(XMLDocumentFragmentScannerImpl.java:193)
	at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method)
	at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1160)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.ClassInitializationSupport.ensureClassInitialized(ClassInitializationSupport.java:177)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.AllowAllHostedUsagesClassInitializationSupport.computeInitKindAndMaybeInitializeClass(AllowAllHostedUsagesClassInitializationSupport.java:191)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.AllowAllHostedUsagesClassInitializationSupport.computeInitKindAndMaybeInitializeClass(AllowAllHostedUsagesClassInitializationSupport.java:160)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.AllowAllHostedUsagesClassInitializationSupport.computeInitKindAndMaybeInitializeClass(AllowAllHostedUsagesClassInitializationSupport.java:160)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.AllowAllHostedUsagesClassInitializationSupport.computeInitKindAndMaybeInitializeClass(AllowAllHostedUsagesClassInitializationSupport.java:129)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.ClassInitializationSupport.maybeInitializeAtBuildTime(ClassInitializationSupport.java:161)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.ClassInitializationSupport.maybeInitializeAtBuildTime(ClassInitializationSupport.java:150)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.SVMHost.isInitialized(SVMHost.java:323)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisType.isInitialized(AnalysisType.java:920)
	at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.maybeEagerlyInitialize(BytecodeParser.java:4488)
	at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.genNewInstance(BytecodeParser.java:4694)
	at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.genNewInstance(BytecodeParser.java:4683)
	at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.genNewInstance(BytecodeParser.java:4678)
	at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5488)
	at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3470)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.iterateBytecodesForBlock(SharedGraphBuilderPhase.java:790)
	at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.handleBytecodeBlock(BytecodeParser.java:3430)
	at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3272)
	at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.build(BytecodeParser.java:1136)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.build(SharedGraphBuilderPhase.java:202)
	at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:1028)
	at jdk.graal.compiler/jdk.graal.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:102)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase.run(SharedGraphBuilderPhase.java:154)
	at jdk.graal.compiler/jdk.graal.compiler.phases.Phase.run(Phase.java:49)
	at jdk.graal.compiler/jdk.graal.compiler.phases.BasePhase.apply(BasePhase.java:435)
	at jdk.graal.compiler/jdk.graal.compiler.phases.Phase.apply(Phase.java:42)
	at jdk.graal.compiler/jdk.graal.compiler.phases.Phase.apply(Phase.java:38)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.AnalysisParsedGraph.parseBytecode(AnalysisParsedGraph.java:144)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisMethod.parseGraph(AnalysisMethod.java:888)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsedHelper(AnalysisMethod.java:853)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsed(AnalysisMethod.java:836)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysisGraphDecoder.lookupEncodedGraph(InlineBeforeAnalysisGraphDecoder.java:175)
	at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.doInline(PEGraphDecoder.java:1215)
	at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.tryInline(PEGraphDecoder.java:1198)
	at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.trySimplifyInvoke(PEGraphDecoder.java:1053)
	at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.handleInvokeWithCallTarget(PEGraphDecoder.java:1005)
	at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.handleInvoke(PEGraphDecoder.java:991)
	at jdk.graal.compiler/jdk.graal.compiler.nodes.GraphDecoder.processNextNode(GraphDecoder.java:930)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysisGraphDecoder.processNextNode(InlineBeforeAnalysisGraphDecoder.java:343)
	at jdk.graal.compiler/jdk.graal.compiler.nodes.GraphDecoder.decode(GraphDecoder.java:658)
	at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.decode(PEGraphDecoder.java:895)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysis.decodeGraph(InlineBeforeAnalysis.java:73)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:198)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:608)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:167)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureFlowsGraphCreated(MethodTypeFlow.java:152)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.getOrCreateMethodFlowsGraphInfo(MethodTypeFlow.java:110)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.typestate.DefaultVirtualInvokeTypeFlow.onObservedUpdate(DefaultVirtualInvokeTypeFlow.java:114)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:628)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.PointsToAnalysis$1.run(PointsToAnalysis.java:538)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.CompletionExecutor.executeCommand(CompletionExecutor.java:169)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.CompletionExecutor.lambda$executeService$0(CompletionExecutor.java:154)
	at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute(ForkJoinTask.java:1726)
	at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute(ForkJoinTask.java:1717)
	at java.base/java.util.concurrent.ForkJoinTask$InterruptibleTask.exec(ForkJoinTask.java:1641)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:507)
	at java.base/java.util.concurrent.ForkJoinPool.externalHelpQuiesce(ForkJoinPool.java:2519)
	at java.base/java.util.concurrent.ForkJoinPool.helpQuiescePool(ForkJoinPool.java:2553)
	at java.base/java.util.concurrent.ForkJoinPool.awaitQuiescence(ForkJoinPool.java:3784)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.CompletionExecutor.complete(CompletionExecutor.java:210)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.PointsToAnalysis.doTypeflow(PointsToAnalysis.java:576)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.PointsToAnalysis.finish(PointsToAnalysis.java:564)
	at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.AbstractAnalysisEngine.runAnalysis(AbstractAnalysisEngine.java:153)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:795)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:573)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:538)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:524)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:699)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.start(NativeImageGeneratorRunner.java:139)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:94)

See: https://github.com/graalvm/mandrel/actions/runs/7154825726/job/19483074935#step:12:1688

In some cases it looks like this:

java.lang.NullPointerException: Cannot invoke "[Ljava.lang.String;.clone()" because "com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.RECOGNIZED_PROPERTIES" is null
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.getRecognizedProperties(XMLDocumentFragmentScannerImpl.java:764)
	at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.getRecognizedProperties(XMLDocumentScannerImpl.java:449)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.addRecognizedParamsAndSetDefaults(XML11Configuration.java:1518)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.addComponent(XML11Configuration.java:1462)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.<init>(XML11Configuration.java:612)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XIncludeAwareParserConfiguration.<init>(XIncludeAwareParserConfiguration.java:136)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.XIncludeAwareParserConfiguration.<init>(XIncludeAwareParserConfiguration.java:93)
	at java.xml/com.sun.org.apache.xerces.internal.parsers.SAXParser.<init>(SAXParser.java:121)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.<init>(SAXParserImpl.java:405)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:137)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:124)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl.newSAXParserImpl(SAXParserFactoryImpl.java:104)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:144)
	at java.xml/javax.xml.catalog.CatalogImpl.getParser(CatalogImpl.java:312)
	at java.xml/javax.xml.catalog.CatalogImpl.parse(CatalogImpl.java:290)
	at java.xml/javax.xml.catalog.CatalogImpl.load(CatalogImpl.java:171)
	at java.xml/javax.xml.catalog.CatalogManager.catalog(CatalogManager.java:73)
	at java.xml/jdk.xml.internal.JdkCatalog.init(JdkCatalog.java:43)
	at java.xml/jdk.xml.internal.XMLSecurityManager.prepareCatalog(XMLSecurityManager.java:305)
	at java.xml/jdk.xml.internal.XMLSecurityManager.<init>(XMLSecurityManager.java:290)
	at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl.<init>(SAXParserFactoryImpl.java:72)
	at java.xml/jdk.xml.internal.JdkXmlUtils.getSAXFactory(JdkXmlUtils.java:441)
	at java.xml/jdk.xml.internal.JdkXmlUtils.<clinit>(JdkXmlUtils.java:97)

See: https://github.com/graalvm/mandrel/actions/runs/7161773572/job/19498392690#step:12:2306

About this issue

  • Original URL
  • State: open
  • Created 7 months ago
  • Comments: 15 (14 by maintainers)

Most upvoted comments

I’ll try to create an upstream issue with a proposed PR later today or tomorrow.

Upstream issue: https://github.com/oracle/graal/issues/8075

FWIW, I’ve got this commit with a tiny patch for upstream discussion. I’ll try to create an upstream issue with a proposed PR later today or tomorrow.

Two test runs with this (it also passes a very opinionated custom reproducer): https://github.com/graalvm/mandrel/actions/runs/7273652011 https://github.com/graalvm/mandrel/actions/runs/7266712957

The best thing I can think of is to eagerly load jdk.xml.internal.JdkXmlUtils in a feature in beforeAnalysis.

That’s inline with what I was thinking as well.

I wonder if there would be a better way to do this in GraalVM

I don’t know but this looks good enough to me.

I also thought about abusing the “typeReachable” condition to only register the classes causing the issue when JdkXmlUtils is reachable, and in the process of checking force the initialization before the registration:

diff --git a/extensions/jaxb/deployment/src/main/java/io/quarkus/jaxb/deployment/JaxbProcessor.java b/extensions/jaxb/deployment/src/main/java/io/quarkus/jaxb/deployment/JaxbProcessor.java
index 17768f6d8e6..8d74a8c74d3 100644
--- a/extensions/jaxb/deployment/src/main/java/io/quarkus/jaxb/deployment/JaxbProcessor.java
+++ b/extensions/jaxb/deployment/src/main/java/io/quarkus/jaxb/deployment/JaxbProcessor.java
@@ -70,6 +70,7 @@
 import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.NativeImageSystemPropertyBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassConditionBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveHierarchyIgnoreWarningBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
@@ -275,6 +276,7 @@ void registerClasses(
             BuildProducer<NativeImageSystemPropertyBuildItem> nativeImageProps,
             BuildProducer<ServiceProviderBuildItem> providerItem,
             BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+            BuildProducer<ReflectiveClassConditionBuildItem> reflectiveClassCondition,
             BuildProducer<NativeImageResourceBundleBuildItem> resourceBundle) {
         addReflectiveClass(reflectiveClass, true, false, "org.glassfish.jaxb.runtime.v2.ContextFactory");
         addReflectiveClass(reflectiveClass, true, false, "com.sun.xml.internal.stream.XMLInputFactoryImpl");
@@ -282,6 +284,13 @@ void registerClasses(
         addReflectiveClass(reflectiveClass, true, false, "com.sun.org.apache.xpath.internal.functions.FuncNot");
         addReflectiveClass(reflectiveClass, true, false, "com.sun.org.apache.xerces.internal.impl.dv.xs.SchemaDVFactoryImpl");
 
+        reflectiveClassCondition
+                .produce(new ReflectiveClassConditionBuildItem("com.sun.xml.internal.stream.XMLInputFactoryImpl",
+                        "jdk.xml.internal.JdkXmlUtils"));
+        reflectiveClassCondition
+                .produce(new ReflectiveClassConditionBuildItem("com.sun.xml.internal.stream.XMLOutputFactoryImpl",
+                        "jdk.xml.internal.JdkXmlUtils"));
+
         addResourceBundle(resourceBundle, "jakarta.xml.bind.Messages");
         addResourceBundle(resourceBundle, "jakarta.xml.bind.helpers.Messages");
 
diff --git a/extensions/jaxp/deployment/src/main/java/io/quarkus/jaxp/deployment/JaxpProcessor.java b/extensions/jaxp/deployment/src/main/java/io/quarkus/jaxp/deployment/JaxpProcessor.java
index b7b06fe00cd..f05000ad03d 100644
--- a/extensions/jaxp/deployment/src/main/java/io/quarkus/jaxp/deployment/JaxpProcessor.java
+++ b/extensions/jaxp/deployment/src/main/java/io/quarkus/jaxp/deployment/JaxpProcessor.java
@@ -8,11 +8,13 @@
 import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassConditionBuildItem;
 
 class JaxpProcessor {
 
     @BuildStep
-    void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
+    void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+            BuildProducer<ReflectiveClassConditionBuildItem> reflectiveClassConditional) {
         reflectiveClass
                 .produce(ReflectiveClassBuildItem.builder("com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl",
                         "com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl",
@@ -26,6 +28,10 @@ void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem> reflectiveClass)
                 "com.sun.org.apache.xpath.internal.functions.FuncNot",
                 "com.sun.org.apache.xerces.internal.impl.dv.xs.SchemaDVFactoryImpl",
                 "javax.xml.namespace.QName").methods().build());
+
+        reflectiveClassConditional
+                .produce(new ReflectiveClassConditionBuildItem("com.sun.org.apache.xerces.internal.parsers.SAXParser",
+                        "jdk.xml.internal.JdkXmlUtils"));
     }
 
     @BuildStep

I believe the Feature approach is less fragile.

or if this could be added to GraalVM itself unconditionally to avoid the ExceptionInInitializerError, yet not adding (m)any classes to the universe unnecessarily.

It’s probably worth an upstream discussion. To my understanding the only reason upstream doesn’t face the same issue (if they actually don’t) is due to using the typeReachable condition. The issue doesn’t seem to be Quarkus specific to me (I believe it would manifest even with run-time initialization, but I haven’t tried reproducing it in that context).

Since this seems a class load ordering issue I’d prefer we fix that on the Quarkus/Mandrel side.

Sure, I started looking at how/why this happens in Mandrel/GraalVM, but didn’t have the time to complete the analysis. I hope I will be able to get to it tonight.

Same here. I keep looking as I failed to reliably reproduce yet. Will keep you posted should I find anything.

@zakkak Thanks for taking a look. I’ll do some more investigation and create an upstream OpenJDK issue once confirmed.