Spring Boot v3.2.0 on graalvm-community-openjdk-21.0.1+12.1

Spring AOT process mvn -Pnative package is resulting in the below error,

Error: Classes that should be initialized at run time got initialized during image building:
 com.ctc.wstx.api.ReaderConfig was unintentionally initialized at build time. org.springframework.http.codec.xml.XmlEventDecoder caused initialization of this class with the following trace:
        at com.ctc.wstx.api.ReaderConfig.<clinit>(ReaderConfig.java:264)
        at com.ctc.wstx.stax.WstxInputFactory.<init>(WstxInputFactory.java:149)
        at java.lang.invoke.DirectMethodHandle$Holder.newInvokeSpecial(DirectMethodHandle$Holder)
        at java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
        at jdk.internal.reflect.DirectConstructorHandleAccessor.invokeImpl(DirectConstructorHandleAccessor.java:86)
        at jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
        at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
        at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
        at javax.xml.stream.FactoryFinder$1.run(FactoryFinder.java:305)
        at java.security.AccessController.executePrivileged(AccessController.java:778)
        at java.security.AccessController.doPrivileged(AccessController.java:319)
        at javax.xml.stream.FactoryFinder.findServiceProvider(FactoryFinder.java:293)
        at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:264)
        at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:210)
        at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:166)
        at org.springframework.util.xml.StaxUtils$$Lambda/0x000000080369ce18.get(Unknown Source)
        at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:77)
        at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:67)
        at org.springframework.http.codec.xml.XmlEventDecoder.<clinit>(XmlEventDecoder.java:87)

Comment From: snicoll

Spring AOT process

It looks like that is native-image trying to process the application, not Spring AOT. Please share a small sample that lets us reproduce the issue. You can attach a zip here or push the code to a separate GitHub repository.

Comment From: syedyusufh

Tried creating a minimal reproducible, still not successful. Is there anyway I could get to know what class or component from the application would trigger this? Thanks

Comment From: bclozel

What Stephane means is that this error looks like a more foundational problem in your build, maybe skipping entirely the AOT phase. Trying to solve this particular instance is likely to let the next one appear and won't solve the bigger problem. Maybe some particular config in your build interferes with how the native build tool plugin should be configured? A sample is really key here. Thanks!

Comment From: syedyusufh

Please find the sample to reproduce the issue

https://github.com/syedyusufh/hello-sample.git

Comment From: snicoll

Thanks for the sample. It looks like that's org.springframework.http.codec.xml.XmlEventDecoder creating a XMLInputFactory.

Full stacktrace:

Error: Classes that should be initialized at run time got initialized during image building:
 com.ctc.wstx.util.DefaultXmlSymbolTable was unintentionally initialized at build time. org.springframework.http.codec.xml.XmlEventDecoder caused initialization of this class with the following trace:
    at com.ctc.wstx.util.DefaultXmlSymbolTable.<clinit>(DefaultXmlSymbolTable.java:30)
    at com.ctc.wstx.stax.WstxInputFactory.<clinit>(WstxInputFactory.java:122)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
    at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
    at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
    at javax.xml.stream.FactoryFinder$1.run(FactoryFinder.java:351)
    at java.security.AccessController.executePrivileged(AccessController.java:776)
    at java.security.AccessController.doPrivileged(AccessController.java:318)
    at javax.xml.stream.FactoryFinder.findServiceProvider(FactoryFinder.java:339)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:310)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:223)
    at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:166)
    at org.springframework.util.xml.StaxUtils$$Lambda$3617/0x00000008021b75d8.get(Unknown Source)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:77)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:67)
    at org.springframework.http.codec.xml.XmlEventDecoder.<clinit>(XmlEventDecoder.java:87)

com.ctc.wstx.api.ReaderConfig was unintentionally initialized at build time. org.springframework.http.codec.xml.XmlEventDecoder caused initialization of this class with the following trace:
    at com.ctc.wstx.api.ReaderConfig.<clinit>(ReaderConfig.java:264)
    at com.ctc.wstx.stax.WstxInputFactory.<init>(WstxInputFactory.java:149)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
    at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
    at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
    at javax.xml.stream.FactoryFinder$1.run(FactoryFinder.java:351)
    at java.security.AccessController.executePrivileged(AccessController.java:776)
    at java.security.AccessController.doPrivileged(AccessController.java:318)
    at javax.xml.stream.FactoryFinder.findServiceProvider(FactoryFinder.java:339)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:310)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:223)
    at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:166)
    at org.springframework.util.xml.StaxUtils$$Lambda$3617/0x00000008021b75d8.get(Unknown Source)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:77)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:67)
    at org.springframework.http.codec.xml.XmlEventDecoder.<clinit>(XmlEventDecoder.java:87)

com.ctc.wstx.api.CommonConfig was unintentionally initialized at build time. org.springframework.http.codec.xml.XmlEventDecoder caused initialization of this class with the following trace:
    at com.ctc.wstx.api.CommonConfig.<clinit>(CommonConfig.java:59)
    at com.ctc.wstx.stax.WstxInputFactory.<init>(WstxInputFactory.java:149)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
    at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
    at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
    at javax.xml.stream.FactoryFinder$1.run(FactoryFinder.java:351)
    at java.security.AccessController.executePrivileged(AccessController.java:776)
    at java.security.AccessController.doPrivileged(AccessController.java:318)
    at javax.xml.stream.FactoryFinder.findServiceProvider(FactoryFinder.java:339)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:310)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:223)
    at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:166)
    at org.springframework.util.xml.StaxUtils$$Lambda$3617/0x00000008021b75d8.get(Unknown Source)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:77)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:67)
    at org.springframework.http.codec.xml.XmlEventDecoder.<clinit>(XmlEventDecoder.java:87)

com.ctc.wstx.stax.WstxInputFactory was unintentionally initialized at build time. org.springframework.http.codec.xml.XmlEventDecoder caused initialization of this class with the following trace:
    at com.ctc.wstx.stax.WstxInputFactory.<clinit>(WstxInputFactory.java:122)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
    at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
    at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
    at javax.xml.stream.FactoryFinder$1.run(FactoryFinder.java:351)
    at java.security.AccessController.executePrivileged(AccessController.java:776)
    at java.security.AccessController.doPrivileged(AccessController.java:318)
    at javax.xml.stream.FactoryFinder.findServiceProvider(FactoryFinder.java:339)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:310)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:223)
    at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:166)
    at org.springframework.util.xml.StaxUtils$$Lambda$3617/0x00000008021b75d8.get(Unknown Source)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:77)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:67)
    at org.springframework.http.codec.xml.XmlEventDecoder.<clinit>(XmlEventDecoder.java:87)


com.oracle.svm.core.util.UserError$UserException: Classes that should be initialized at run time got initialized during image building:
 com.ctc.wstx.util.DefaultXmlSymbolTable was unintentionally initialized at build time. org.springframework.http.codec.xml.XmlEventDecoder caused initialization of this class with the following trace:
    at com.ctc.wstx.util.DefaultXmlSymbolTable.<clinit>(DefaultXmlSymbolTable.java:30)
    at com.ctc.wstx.stax.WstxInputFactory.<clinit>(WstxInputFactory.java:122)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
    at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
    at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
    at javax.xml.stream.FactoryFinder$1.run(FactoryFinder.java:351)
    at java.security.AccessController.executePrivileged(AccessController.java:776)
    at java.security.AccessController.doPrivileged(AccessController.java:318)
    at javax.xml.stream.FactoryFinder.findServiceProvider(FactoryFinder.java:339)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:310)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:223)
    at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:166)
    at org.springframework.util.xml.StaxUtils$$Lambda$3617/0x00000008021b75d8.get(Unknown Source)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:77)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:67)
    at org.springframework.http.codec.xml.XmlEventDecoder.<clinit>(XmlEventDecoder.java:87)

com.ctc.wstx.api.ReaderConfig was unintentionally initialized at build time. org.springframework.http.codec.xml.XmlEventDecoder caused initialization of this class with the following trace:
    at com.ctc.wstx.api.ReaderConfig.<clinit>(ReaderConfig.java:264)
    at com.ctc.wstx.stax.WstxInputFactory.<init>(WstxInputFactory.java:149)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
    at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
    at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
    at javax.xml.stream.FactoryFinder$1.run(FactoryFinder.java:351)
    at java.security.AccessController.executePrivileged(AccessController.java:776)
    at java.security.AccessController.doPrivileged(AccessController.java:318)
    at javax.xml.stream.FactoryFinder.findServiceProvider(FactoryFinder.java:339)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:310)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:223)
    at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:166)
    at org.springframework.util.xml.StaxUtils$$Lambda$3617/0x00000008021b75d8.get(Unknown Source)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:77)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:67)
    at org.springframework.http.codec.xml.XmlEventDecoder.<clinit>(XmlEventDecoder.java:87)

com.ctc.wstx.api.CommonConfig was unintentionally initialized at build time. org.springframework.http.codec.xml.XmlEventDecoder caused initialization of this class with the following trace:
    at com.ctc.wstx.api.CommonConfig.<clinit>(CommonConfig.java:59)
    at com.ctc.wstx.stax.WstxInputFactory.<init>(WstxInputFactory.java:149)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
    at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
    at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
    at javax.xml.stream.FactoryFinder$1.run(FactoryFinder.java:351)
    at java.security.AccessController.executePrivileged(AccessController.java:776)
    at java.security.AccessController.doPrivileged(AccessController.java:318)
    at javax.xml.stream.FactoryFinder.findServiceProvider(FactoryFinder.java:339)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:310)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:223)
    at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:166)
    at org.springframework.util.xml.StaxUtils$$Lambda$3617/0x00000008021b75d8.get(Unknown Source)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:77)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:67)
    at org.springframework.http.codec.xml.XmlEventDecoder.<clinit>(XmlEventDecoder.java:87)

com.ctc.wstx.stax.WstxInputFactory was unintentionally initialized at build time. org.springframework.http.codec.xml.XmlEventDecoder caused initialization of this class with the following trace:
    at com.ctc.wstx.stax.WstxInputFactory.<clinit>(WstxInputFactory.java:122)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
    at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
    at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
    at javax.xml.stream.FactoryFinder$1.run(FactoryFinder.java:351)
    at java.security.AccessController.executePrivileged(AccessController.java:776)
    at java.security.AccessController.doPrivileged(AccessController.java:318)
    at javax.xml.stream.FactoryFinder.findServiceProvider(FactoryFinder.java:339)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:310)
    at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:223)
    at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:166)
    at org.springframework.util.xml.StaxUtils$$Lambda$3617/0x00000008021b75d8.get(Unknown Source)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:77)
    at org.springframework.util.xml.StaxUtils.createDefensiveInputFactory(StaxUtils.java:67)
    at org.springframework.http.codec.xml.XmlEventDecoder.<clinit>(XmlEventDecoder.java:87)


    at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.UserError.abort(UserError.java:73)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.ProvenSafeClassInitializationSupport.checkDelayedInitialization(ProvenSafeClassInitializationSupport.java:277)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.ClassInitializationFeature.duringAnalysis(ClassInitializationFeature.java:164)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$10(NativeImageGenerator.java:770)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.FeatureHandler.forEachFeature(FeatureHandler.java:86)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$11(NativeImageGenerator.java:770)
    at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.AbstractAnalysisEngine.runAnalysis(AbstractAnalysisEngine.java:179)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:767)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:582)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:539)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:408)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:612)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.start(NativeImageGeneratorRunner.java:134)
    at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:94)

Comment From: syedyusufh

@bclozel / @snicoll kindly help with the reported issue. Thx in advance

Comment From: sdeleuze

This is a GraalVM level issue. You can use --strict-image-heap build argument at native-image level with recent GraalVM 21 builds to fix it, that flag should be enabled by default as of GraalVM 22.