Search code examples
quarkusgraalvm-native-image

No instances of ... are allowed in the image heap as this class should be initialized at image runtime


I am running a simple Java application (just a REST endpoint, a "Hello" response - exactly the example generated by the Quarkus maven archetype, without modification) with the following stack:

  • Quarkus (MicroProfile)
  • JDK 1.8 HotSpot 1.8.0_231-b11
  • GraalVM 19.3.0 (native-image)
  • MacOS Catalina

The first error it is (although it does'nt seems to be the main problem):

[code-with-quarkus-1.0.0-SNAPSHOT-runner:1868]        setup:   8,524.65 ms
java.lang.NoSuchMethodException: com.oracle.svm.core.jdk.LocalizationSupport.addBundleToCache(java.lang.String)
    at java.lang.Class.getDeclaredMethod(Class.java:2130)
    at io.quarkus.runner.AutoFeature.beforeAnalysis(AutoFeature.zig:744)
    at com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$7(NativeImageGenerator.java:669)
    at com.oracle.svm.hosted.FeatureHandler.forEachFeature(FeatureHandler.java:63)
    at com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:669)
    at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:530)
    at com.oracle.svm.hosted.NativeImageGenerator.lambda$run$0(NativeImageGenerator.java:445)
    at java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1386)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
20:17:42,508 INFO  [org.jbo.threads] JBoss Threads version 3.0.0.Final
[code-with-quarkus-1.0.0-SNAPSHOT-runner:1868]   (typeflow):  34,257.18 ms
[code-with-quarkus-1.0.0-SNAPSHOT-runner:1868]    (objects):  19,361.86 ms
[code-with-quarkus-1.0.0-SNAPSHOT-runner:1868]   (features):     866.06 ms
[code-with-quarkus-1.0.0-SNAPSHOT-runner:1868]     analysis:  56,364.44 ms

The real problem (I think) it is here:

Error: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of java.net.Inet4Address are allowed in the image heap as this class should be initialized at image runtime. To see how this object got instantiated use -H:+TraceClassInitialization.
Detailed message:
Trace:
    at parsing org.wildfly.common.net.CidrAddress.<clinit>(CidrAddress.java:46)
Call path from entry point to org.wildfly.common.net.CidrAddress.<clinit>():
    no path found from entry point to target method

So, the first thing I tried was to instruct that the class org.wildfly.common.net.CidrAddress don't be initialized at Image BuildTime, rather initialized at the Image RunTime, with the configuration:

quarkus.native.additional-build-args=--initialize-at-run-time=org.wildfly.common.net.CidrAddress
quarkus.native.enable-jni=true 

But, nothing changes. I also tried to activate (as instructed) the parameter -H:+TraceClassInitialization, to find out what class is being initialized that could be causing the problem. No effect! It doesn't make any difference with this parameter (no extra info).

Did someone else go through this scenario? Any hints, ideas?

Thanks!


Solution

  • GraalVM 19.3.0 is not supported by Quarkus yet, it was just released and it will need some changes.

    In particular you're hitting this problem: - https://github.com/quarkusio/quarkus/pull/5353

    I expect GraalVM 19.3 to be supported by Quarkus 1.1, but I'm not sure.