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

瘦欲@ 提交于 2021-02-07 04:22:55

问题


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!


回答1:


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.




回答2:


I had the same problem with my multistage build:

First I modified my pom.xml:

          <build>
            <plugins>
                <plugin>
                    <groupId>io.quarkus</groupId>
                    <artifactId>quarkus-maven-plugin</artifactId>
                    <version>${quarkus.version}</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>native-image</goal>
                            </goals>
                            <configuration>
                                <enableHttpUrlHandler>true</enableHttpUrlHandler>
                                <enableHttpsUrlHandler>true</enableHttpsUrlHandler>
                                <enableJni>true</enableJni>
                                <additionalBuildArgs>--initialize-at-run-time=java.net.Inet6Address -H:+TraceClassInitialization</additionalBuildArgs>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>

Still the same error...

Then I changed the base image of my Dockerfile from FROM quay.io/quarkus/centos-quarkus-maven:19.3.0-java8 AS build to FROM quay.io/quarkus/centos-quarkus-maven:19.2.1 AS build Here is my complete Dockerfile.multistage:

FROM quay.io/quarkus/centos-quarkus-maven:19.2.1 AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app/pom.xml
USER root
RUN chown -R quarkus /usr/src/app
USER quarkus
RUN mvn -f /usr/src/app/pom.xml -Pnative clean package

## Stage 2 : create the docker final image
FROM registry.access.redhat.com/ubi8/ubi-minimal
WORKDIR /work/
COPY --from=build /usr/src/app/target/*-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]


来源:https://stackoverflow.com/questions/59011565/no-instances-of-are-allowed-in-the-image-heap-as-this-class-should-be-initia

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!