当前位置: 首页 > 知识库问答 >
问题:

没有。。。允许在映像堆中使用,因为此类应在映像运行时初始化

汪阿苏
2023-03-14

我正在使用以下堆栈运行一个简单的Java应用程序(只是一个RESTendpoint,一个“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

所以,我试着做的第一件事就是指示班级组织起来。野蝇。常见的网CidraDress不会在映像构建时初始化,而是在映像运行时初始化,配置如下:

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

但是,什么都没有改变。我还试图激活(按照指示)参数-H: TraceClass初始化,以找出哪个类正在初始化,这可能会导致问题。没有效果!这个参数没有任何区别(没有额外的信息)。

有人经历过这个场景吗?有什么线索,想法吗?

谢谢

共有2个答案

郭知
2023-03-14

我的多级构建也有同样的问题:

首先我修改了我的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的基本图像从quay更改为。io/quarkus/centos quarkus maven:19.3.0-java8作为从码头到码头的构建。io/quarkus/centos quarkus maven:19.2.1 AS build这是我完整的Dockerfile。多阶段:

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"]
党权
2023-03-14

Quarkus还不支持GraalVM 19.3.0,它刚刚发布,需要一些更改。

尤其是你遇到了这个问题:https://github.com/quarkusio/quarkus/pull/5353

我希望Quarkus1.1支持GraalVM 19.3,但我不确定。

 类似资料:
  • 我有一个小Java应用程序,它使用Micronaut 2.0.0实现了一个RESTful API。在引擎盖下,它使用Redisson 3.13.1进入Redis。Redisson则使用Netty(4.1.49)。 该应用程序在“经典”java(在HotSpot上,java 8和java 11)中运行良好。 我正在尝试使用GraalVM从这个应用程序构建一个本机映像。 命令大致如下: 以下是我得到的

  • 提前谢谢。 所以我试图用Maven部署JavaFX应用程序。 它给了我这个错误 我知道为什么它会给出错误。我正在使用Firebase。所以在构建时间初始化的类很少。那么我如何避免它呢? 我评论了我在我的项目中做的所有Firebase代码,并再次测试了它,然后它工作正常。但是当我再次包含Firebase时,我面临这个问题。任何帮助请

  • 问题内容: 我使用Java创建了一个Docker映像,并将jar文件复制到该映像中。我的Dockerfile是: 执行以下命令后: 在控制台中,我看到了应用程序的输出,一切都很好。但是当我停止图像时,我不知道如何再次运行图像?当我执行以下命令时: 该应用程序再次运行,但是在我的Dockerfile中,我已经编写了此命令。如何在不使用此命令的情况下运行映像并使应用程序自动运行? 问题答案: 图像和容

  • 我正在按照有关将ASP.NET MVC应用程序迁移到Windows容器的说明进行操作 我用过 而且似乎下载正确。 然后看到与前面相同的内容,但以“Service'w3svc'was started”行结尾 因此,-it命令似乎有助于让我感觉我已经成功启动了容器。 我实际上无法获得关于“-it”的帮助,因为当我运行时它没有列出

  • 问题内容: 我有一个Docker映像,它是一个node.js应用程序。该应用程序从本地运行的Redis检索一些配置值。因此, 我试图在Docker映像内的同一容器内安装和运行Redis。 如何扩展Docker文件并在其中配置Redis? 到目前为止,Dockerfile如下: 从节点:碳 WORKDIR / app COPY package.json / app 运行npm安装 复制。/ app

  • 我有一个Docker映像,它是一个Node.js应用程序。应用程序从本地运行的Redis检索一些配置值。因此,我试图在Docker映像的同一容器中安装和运行Redis。 我如何扩展Docker文件并在其中配置Redis? 截至目前,Dockerfile如下所示: