При создании собственного образа кваркуса, как мне (ре) структурировать свой код, чтобы включить инициализацию класса среды выполнения?

Я создаю собственный образ с помощью quarkus, и анализ граля не работает с ошибкой:

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_Systemcom.nimbusds0002egetProperty_00028Ljava_lang_Stringcom.nimbusds00029Ljava_lang_String_2(generated:0)

В нем правильно и логично указано, что класс для поставщика генератора случайных чисел должен быть инициализирован во время выполнения. Однако, в отличие от docs, путь вызова отсутствует. дается, потому что:

Объект был инициализирован без инструментария инициализации образа в машинном коде, и трассировку стека невозможно отследить.

Я не знаю, как реструктурировать свой код для поддержки этого, и, насколько я могу судить, я не делаю ничего действительно экзотического. Чтобы подготовить этот вопрос, я жестоко переместил код вместе с классами из com.nimbusds, и теперь он находится в OAuthService и OAuthAccessTokenProvider. 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)

Предполагается, что я избегаю инициализации этих классов, но я не знаю, что я делаю не так и какие существуют другие возможности. Что я наблюдал?

РЕДАКТИРОВАТЬ: Я строю с Quarkus 1.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 напрямую.


person Neil Crossley    schedule 29.07.2020    source источник


Ответы (1)


Скорее всего нужно использовать rerun-class-initialization-at-runtime= com.nimbusds.oauth2.sdk.id.Identifier

person geoand    schedule 31.07.2020