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

在构建原生夸克映像时,我应该如何(重新)构造我的代码以启用运行时类初始化?

封景曜
2023-03-14

我正在用夸库斯构建一个原生图像,graal分析失败了,出现错误:

Error: No instances of sun.security.provider.NativePRNG are allowed in the image heap as this class should be initialized at image runtime. Object has been initialized without the native-image initialization instrumentation and the stack trace can't be tracked.
Detailed message:                                                                                                                                                                                                                                                    
Trace: Object was reached by                                                                                                      
        reading field java.security.SecureRandom.secureRandomSpi of                                                               
                constant java.security.SecureRandom@472a6481 reached by                                                                                                                                                                                              
        scanning method com.nimbusds.oauth2.sdk.id.Identifier.<init>(Identifier.java:112)                                                                                                                                                                            
Call path from entry point to com.nimbusds.oauth2.sdk.id.Identifier.<init>(int):                                                                                                                                                                                     
        at com.nimbusds.oauth2.sdk.id.Identifier.<init>(Identifier.java:105)                                                                                                                                                                                         
        at com.nimbusds.oauth2.sdk.token.Token.<init>(Token.java:62)                                                                                                                                                                                                 
        at com.nimbusds.oauth2.sdk.token.AccessToken.<init>(AccessToken.java:121)                                                                                                                                                                                    
        at com.nimbusds.oauth2.sdk.token.BearerAccessToken.<init>(BearerAccessToken.java:114)                                                                                                                                                                        
        at ff.service.identity.application.OAuthAccessTokenProvider.generateAccessToken(OAuthAccessTokenProvider.java:78)                                                                                                                                            
        at ff.service.identity.application.OAuthAccessTokenProvider.completeAccessTokenGeneration(OAuthAccessTokenProvider.java:62)                                                                                                                                  
        at ff.service.identity.application.OAuthAccessTokenProvider_ClientProxy.completeAccessTokenGeneration(OAuthAccessTokenProvider_ClientProxy.zig:198)                                                                                                          
        at ff.service.identity.application.OAuthService.validateSignedChallenge(OAuthService.java:187)                                                                                                                                                               
        at ff.service.identity.application.OAuthService_Subclass.validateSignedChallenge$$superaccessor1(OAuthService_Subclass.zig:258)                                                                                                                              
        at ff.service.identity.application.OAuthService_Subclass$$function$$1.apply(OAuthService_Subclass$$function$$1.zig:41)                                                                                                                                       
        at sun.security.ec.XECParameters$1.get(XECParameters.java:183)                                                            
        at com.oracle.svm.core.jdk.SystemPropertiesSupport.initializeLazyValue(SystemPropertiesSupport.java:190)                                                                                                                                                     
        at com.oracle.svm.core.jdk.SystemPropertiesSupport.getProperty(SystemPropertiesSupport.java:143)                                                                                                                                                             
        at com.oracle.svm.core.jdk.Target_java_lang_System.getProperty(JavaLangSubstitutions.java:345)                                                                                                                                                               
        at com.oracle.svm.jni.JNIJavaCallWrappers.jniInvoke_ARRAY:Ljava_lang_System_2_0002egetProperty_00028Ljava_lang_String_2_00029Ljava_lang_String_2(generated:0)

它正确且逻辑地声明随机数生成器提供程序的类应该在运行时初始化。但是,与文档中不同的是,没有给出调用路径,因为:

对象已在没有本机映像初始化检测的情况下初始化,并且无法跟踪堆栈跟踪

我不知道如何重组我的代码来支持这一点,而且就我所知,我并没有做任何真正奇怪的事情。为了准备这个问题,我粗暴地将涉及类的代码从com.nimbusds中移到一起,现在它驻留在oauthserviceoauthaccesstokenprovider中。oauthservice仅由我的oauthresouce使用,即使使这两个服务@requestscoped强制执行延迟初始化后,错误消息仍保持不变。

当我添加--initialize-at-run-time=ff.service.identity.application.oauthservice时,我实际上收到的关于观察到的问题的信息较少。

Error: Classes that should be initialized at run time got initialized during image building:
 ff.service.identity.application.OAuthService the class was requested to be initialized at run time (from the command line). ff.service.identity.application.OAuthService has been initialized without the native-image initialization instrumentation and the stack trace can't be tracked. Try avoiding to initialize the class that caused initialization of ff.service.identity.application.OAuthService

com.oracle.svm.core.util.UserError$UserException: Classes that should be initialized at run time got initialized during image building:
 ff.service.identity.application.OAuthService the class was requested to be initialized at run time (from the command line). ff.service.identity.application.OAuthService has been initialized without the native-image initialization instrumentation and the stack trace can't be tracked. Try avoiding to initialize the class that caused initialization of ff.service.identity.application.OAuthService

        at com.oracle.svm.core.util.UserError.abort(UserError.java:68)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.checkDelayedInitialization(ConfigurableClassInitialization.java:518)
        at com.oracle.svm.hosted.classinitialization.ClassInitializationFeature.duringAnalysis(ClassInitializationFeature.java:187)
        at com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$8(NativeImageGenerator.java:720)
        at com.oracle.svm.hosted.FeatureHandler.forEachFeature(FeatureHandler.java:70)
        at com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:720)
        at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:538)
        at com.oracle.svm.hosted.NativeImageGenerator.lambda$run$0(NativeImageGenerator.java:451)
        at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1407)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)

我被推托来避免初始化这些类,但我不知道我做错了什么,或者还有什么其他的可能性存在。我看到了什么?

编辑:我正在使用Quarkus1.6.1.Final,使用GraalVM版本20.1.0(Java版本11.0.7)构建。

涉及标志--rerun-class-initialization-at-runtime的解决方案实际上是不推荐使用的,因为GraalVM 19.0.0(我找不到链接):

警告:使用不推荐使用的选项--rerun-class-initialization-at-runtime。目前没有替代此选项。尝试使用--initialize-at-run-time或直接使用非API选项-h:classinitialization。

共有1个答案

凌炜
2023-03-14

您很可能需要使用rerun-class-initialization-at-runtime=com.nimbusds.oauth2.sdk.id.identifier

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

  • 目前,我发现谷歌云构建发生在构建docker图像的时候(不像我想象的那样,它会构建我的图像,然后执行我的图像来完成所有的构建)。那是在这篇文章里 谷歌云构建的快速启动 我有一个Dockerfile现在很简单 我有一个单一的下载和提取下载任何工件(zip文件)从最后的单构建运行构建(只有修改的服务器被构建或依赖于上一个CI构建的变化的服务器被构建,就像下游库可能被更改)。第一行只是列出了我需要在一个

  • 我对Hibernate(JPA)很陌生。 正如您所看到的,当Gradle升级到5.0时,这个变通方法将会失败。 所以,我想问你我应该如何用Hibernate和Gradle构建我的代码。 根据一些SO的QA,我试图添加以下依赖项,但它不起作用。 null 错误输出如下所示(位a很长,但我不确定要解决的重要线索在哪里):

  • 本文向大家介绍Angular如何在应用初始化时运行代码详解,包括了Angular如何在应用初始化时运行代码详解的使用技巧和注意事项,需要的朋友参考一下 前言 想象一下,您的应用需要一些动态配置信息,这些信息在应用启动之前需要动态获取,并在应用运行中使用。 显然不能直接写道静态配置文件中,但是从客户端发出的请求又是一个异步请求,如何协调这个问题呢? 这里,我想向您演示,如何在 Angular 应用初

  • 我使用jsonschema生成器基于我的POJO生成JSON模式文件。目前,我正在通过一个在<code>gradle构建</code>步骤中运行的测试来完成这项工作。这工作正常,但感觉不对,因为我所做的并不是测试任何东西。 我还找到了这个答案,其中详细说明了如何在上运行它,但这也不理想,因为它会在每次应用程序出现时毫无意义地执行它,但在我构建时不会。 因此,有没有一种方法可以告诉gradle(在中

  • 我有一个开发数据库,我想在docker映像中提交该数据库,将其推送到一个私有存储库,并在本地开发和CI构建中使用。 数据库保存为SQL备份,通过将备份文件映射到官方映像的目录,它将在第一次运行容器时执行此备份文件。发生这种情况时,MariaDB会将数据库还原到容器内中的数据文件中。 理论上,我可以停止容器,将其提交给一个新图像,推动它,然后我就完成了。然而,MariaDB的Dockerfile声明