Spring Boot 2.3 + GraalVM解析配置

问题描述

我有一个Spring Boot 2.3应用程序,我想将其编译为本地映像。

我使用GraalVM 20.1.0.r11-grl作为SDK / JDK,并且我的应用程序可以编译并正常运行。 我正在使用Gradle作为构建工具,并且正在使用https://github.com/ayltai/spring-graalvm-native-plugin访问Native Image功能-效果很好。

当我尝试编译本机映像时,得到以下堆栈跟踪(在详细模式下,原始记录长约900行,因此我尝试挑选相关位):

WARNING: Could not register reflection metadata for org.springframework.boot.actuate.autoconfigure.endpoint.web.reactive.WebFluxEndpointManagementContextConfiguration. Reason: java.lang.NoClassDefFoundError: org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.
WARNING: Could not register reflection metadata for org.springframework.boot.actuate.autoconfigure.web.jersey.JerseySameManagementContextConfiguration. Reason: java.lang.NoClassDefFoundError: org/glassfish/jersey/server/ResourceConfig.
[valuable-api:14937]     analysis:  53,754.65 ms,3.98 GB
Fatal error:com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing org.springframework.hateoas.config.WebFluxHateoasConfiguration$WebFluxCodecs.getDecoder(com.fasterxml.jackson.databind.ObjectMapper,java.util.List) 
Parsing context:
        parsing com.oracle.svm.reflect.WebFluxHateoasConfiguration$WebFluxCodecs_getDecoder_ebe8383216b03b797b6e4dde145c81aea1634443_11905.invoke(Unknown Source)
        parsing java.lang.reflect.Method.invoke(Method.java:566)
        parsing org.springframework.core.convert.support.ObjectToObjectConverter.convert(ObjectToObjectConverter.java:102)
        parsing org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41)
        parsing org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:191)
        parsing org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:174)
        parsing org.springframework.core.env.AbstractPropertyResolver.convertValueIfNecessary(AbstractPropertyResolver.java:265)
        parsing org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:91)
        parsing org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:62)
        parsing org.springframework.core.env.AbstractPropertyResolver.getProperty(AbstractPropertyResolver.java:169)
        parsing org.springframework.core.env.AbstractEnvironment.getProperty(AbstractEnvironment.java:540)
        parsing org.springframework.boot.SpringApplicationBannerPrinter.createStringFromBanner(SpringApplicationBannerPrinter.java:116)
        parsing org.springframework.boot.SpringApplicationBannerPrinter.print(SpringApplicationBannerPrinter.java:61)
        parsing org.springframework.boot.SpringApplication.printBanner(SpringApplication.java:556)
        parsing org.springframework.boot.SpringApplication.run(SpringApplication.java:310)
        parsing org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
        parsing org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
        parsing nz.ringfence.valuable.api.ValuableApiApplication.main(ValuableApiApplication.java:11)
        parsing com.oracle.svm.core.JavaMainWrapper.runCore(JavaMainWrapper.java:149)
        parsing com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:184)
        parsing com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(generated:0)

        at com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:138)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:336)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:311)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:112)
        at com.oracle.graal.pointsto.flow.StaticInvokeTypeFlow.update(InvokeTypeFlow.java:437)
        at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:530)
        at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:173)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426)
        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)
Caused by: org.graalvm.compiler.java.BytecodeParser$BytecodeParserError: java.lang.NoClassDefFoundError: org/reactivestreams/Publisher
        at parsing org.springframework.hateoas.config.WebFluxHateoasConfiguration$WebFluxCodecs.getDecoder(WebFluxHateoasConfiguration.java:123)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.throwParserError(BytecodeParser.java:2590)
        at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.throwParserError(SharedGraphBuilderPhase.java:94)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3428)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3230)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:1088)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:982)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.run(Phase.java:49)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:214)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:42)
        at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:38)
        at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:225)
        at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:352)
        at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:322)
        ... 11 more
Caused by: java.lang.NoClassDefFoundError: org/reactivestreams/Publisher
        at jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVM.getDeclaredMethods(Native Method)
        at jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl.getDeclaredMethods(HotSpotResolvedObjectTypeImpl.java:958)
        at com.oracle.svm.hosted.classinitialization.ClassInitializationFeature.declaresDefaultMethods(ClassInitializationFeature.java:385)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.processInterfaces(ConfigurableClassInitialization.java:606)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:565)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:132)
        at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.maybeInitializeHosted(ConfigurableClassInitialization.java:160)
        at com.oracle.svm.hosted.SVMHost.registerType(SVMHost.java:223)
        at com.oracle.graal.pointsto.meta.AnalysisUniverse.createType(AnalysisUniverse.java:264)
        at com.oracle.graal.pointsto.meta.AnalysisUniverse.lookupAllowUnresolved(AnalysisUniverse.java:205)
        at com.oracle.graal.pointsto.meta.AnalysisUniverse.lookup(AnalysisUniverse.java:182)
        at com.oracle.graal.pointsto.meta.AnalysisType.convertTypes(AnalysisType.java:209)
        at com.oracle.graal.pointsto.meta.AnalysisType.<init>(AnalysisType.java:169)
        at com.oracle.graal.pointsto.meta.AnalysisUniverse.createType(AnalysisUniverse.java:263)
        at com.oracle.graal.pointsto.meta.AnalysisUniverse.lookupAllowUnresolved(AnalysisUniverse.java:205)
        at com.oracle.graal.pointsto.meta.AnalysisUniverse.lookup(AnalysisUniverse.java:182)
        at com.oracle.graal.pointsto.meta.AnalysisType.<init>(AnalysisType.java:168)
        at com.oracle.graal.pointsto.meta.AnalysisUniverse.createType(AnalysisUniverse.java:263)
        at com.oracle.graal.pointsto.meta.AnalysisUniverse.lookupAllowUnresolved(AnalysisUniverse.java:205)
        at com.oracle.graal.pointsto.infrastructure.WrappedConstantPool.lookupType(WrappedConstantPool.java:155)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.lookupType(BytecodeParser.java:4274)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genNewInstance(BytecodeParser.java:4545)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5343)
        at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3423)
        ... 22 more
Caused by: java.lang.ClassNotFoundException: org.reactivestreams.Publisher
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 46 more
Error: Image build request failed with exit status 1
com.oracle.svm.driver.NativeImage$NativeImageError: Image build request failed with exit status 1
        at com.oracle.svm.driver.NativeImage.showError(NativeImage.java:1541)
        at com.oracle.svm.driver.NativeImage.build(NativeImage.java:1299)
        at com.oracle.svm.driver.NativeImage.performBuild(NativeImage.java:1260)
        at com.oracle.svm.driver.NativeImage.main(NativeImage.java:1219)
        at com.oracle.svm.driver.NativeImage$JDK9Plus.main(NativeImage.java:1722)

所以似乎发生了此错误,因为Native Image认为我的类路径上有一个WebFlux组件,并且当它尝试处理该组件时,找不到它,因此ClassNotFoundException位于底部跟踪。

这是我的依赖项:

// Spring Boot
implementation('org.springframework.boot:spring-boot-starter-actuator')
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
implementation('org.springframework.hateoas:spring-hateoas:1.1.1.RELEASE')
implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.springframework.boot:spring-boot-starter-security')
implementation('org.springframework.boot:spring-boot-starter-aop')
implementation('org.springframework.boot:spring-boot-starter-validation')
runtimeOnly('org.springframework.boot:spring-boot-devtools')
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"

// Native Image
implementation('org.springframework:spring-context-indexer')
implementation('org.springframework.experimental:spring-graalvm-native:0.7.1')

// Testing
testImplementation('org.junit.jupiter:junit-jupiter-api:5.3.1')
testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.3.1')
testImplementation('org.springframework.boot:spring-boot-starter-test')
testImplementation("org.assertj:assertj-core:3.12.0")
testImplementation 'org.mockito:mockito-core:2.+'
testImplementation "org.springframework.security:spring-security-test"
testImplementation 'com.intuit.karate:karate-junit5:0.9.5'
testImplementation 'com.intuit.karate:karate-apache:0.9.5'
testImplementation "net.masterthought:cucumber-reporting:3.8.0"

// Persistence
implementation('com.h2database:h2')
implementation('org.postgresql:postgresql')
implementation('org.springframework.boot:spring-boot-starter-jdbc')
implementation "org.flywaydb:flyway-core"

// Swagger
implementation 'org.springdoc:springdoc-openapi-ui:1.3.0'

// Observability
implementation 'io.sentry:sentry-spring:1.7.30'
implementation 'io.honeycomb.beeline:beeline-spring-boot-starter:1.2.0'
implementation 'nl.basjes.parse.useragent:yauaa:5.18'

// Security
implementation 'com.auth0:auth0-spring-security-api:1.3.1'
implementation 'org.springframework.security:spring-security-oauth2-resource-server'
implementation 'org.springframework.security:spring-security-oauth2-jose'
implementation 'org.springframework.security:spring-security-config'

// Outgoing Email
implementation 'com.sendgrid:sendgrid-java:4.0.1'

那里没有反应成分。我唯一能想到的是某处存在传递依赖,但是非响应组件具有传递依赖是没有道理的吗?

以前有人遇到过此问题吗?如何调试和解决此问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...