В куче изображений не допускаются экземпляры, так как этот класс должен быть инициализирован во время выполнения изображения.

Я запускаю простое приложение Java (только конечная точка REST, ответ «Hello» - в точности пример, созданный архетипом Quarkus maven, без изменений) со следующим стеком:

  • Quarkus (Микропрофиль)
  • JDK 1.8 HotSpot 1.8.0_231-b11
  • GraalVM 19.3.0 (собственный образ)
  • MacOS Catalina

Это первая ошибка (хотя это не кажется основной проблемой):

[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

Настоящая проблема (я думаю) здесь:

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

Итак, первое, что я попытался сделать, это указать, что класс org.wildfly.common.net.CidrAddress не инициализируется в Image BuildTime, а инициализируется в Image RunTime с конфигурацией:

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

Но ничего не меняется. Я также попытался активировать (в соответствии с инструкциями) параметр -H: + TraceClassInitialization, чтобы узнать, какой класс инициализируется, что может вызвать проблему. Нет эффекта! Это не имеет значения для этого параметра (без дополнительной информации).

Кто-то еще прошел через этот сценарий? Есть подсказки, идеи?

Спасибо!


person Ualter Jr.    schedule 23.11.2019    source источник


Ответы (2)


GraalVM 19.3.0 пока не поддерживается Quarkus, он только что выпущен и потребует некоторых изменений.

В частности, вы столкнулись с этой проблемой: - https://github.com/quarkusio/quarkus/pull/5353

Я ожидаю, что GraalVM 19.3 будет поддерживаться Quarkus 1.1, но я не уверен.

person Sanne    schedule 24.11.2019
comment
Спасибо, @Sanne, проблема действительно была в несовместимых версиях (Quarkus 1.0 против GraalVM 19.3.0), при замене GraalVM на версию 19.2.1 он работал идеально! - person Ualter Jr.; 24.11.2019

У меня была такая же проблема с моей многоступенчатой ​​сборкой:

Сначала я изменил свой 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>

Все та же ошибка ...

Затем я изменил базовый образ своего Dockerfile с FROM quay.io/quarkus/centos-quarkus-maven:19.3.0-java8 AS build на FROM quay.io/quarkus/centos- quarkus-maven: 19.2.1 AS build Вот мой полный 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"]
person NikolayKostadinov    schedule 24.11.2019
comment
Спасибо за ответ, но на самом деле я (все еще) не создаю образ Docker, я все еще на один шаг раньше, мне просто нужен собственный (исполняемый файл), сгенерированный локально, а не образ Docker, поэтому я не думаю, что файл Dockerfile играет какую-либо роль в этой проблеме (по крайней мере, у меня), команда: mvn package -Pnative (ничего о Dockerfile). В любом случае, спасибо! - person Ualter Jr.; 24.11.2019
comment
Проверьте свою версию GRAALVM с помощью $ GRAALVM_HOME / bin / lli --version, если это 19.3.0, переключение на 19.2.1 может помочь. Если вы используете https, ssl, возможно, вам стоит взглянуть и на этот: github. com / quarkusio / quarkus / issues / 2125 Потерял там час своей жизни ... - person NikolayKostadinov; 24.11.2019
comment
Спасибо, @NikolayKostadinov, как также объяснил Санне, проблема в версии, Quarkus 1.0 он не готов для GraalVM 19.3.0, меняя GraalVM на версию 19.2.1, он работал идеально! Ваше здоровье. - person Ualter Jr.; 24.11.2019