我正在嘗試執行由 Spring Native 和 Spring Boot 構建的本機映像。執行我在 /target 目錄中生成的應用程式會給我以下錯誤:
WARN 18883 --- [ main] w.s.c.ServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodValidationPostProcessor': Unexpected exception during bean creation; nested exception is com.oracle.svm.core.jdk.UnsupportedFeatureError: Unsupported method java.lang.Class.isSealed() is reachable: The declaring class of this element has been substituted, but this element is not present in the substitution class
ERROR 18883 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodValidationPostProcessor': Unexpected exception during bean creation; nested exception is com.oracle.svm.core.jdk.UnsupportedFeatureError: Unsupported method java.lang.Class.isSealed() is reachable: The declaring class of this element has been substituted, but this element is not present in the substitution class
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:555) ~[na:na]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[na:na]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[na:na]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[na:na]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[na:na]
at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:258) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:762) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:567) ~[na:na]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[na:na]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[clea-ws-rest:2.7.0]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[clea-ws-rest:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[clea-ws-rest:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[clea-ws-rest:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[clea-ws-rest:2.7.0]
at fr.gouv.clea.ws.CleaWsRestApplication.main(CleaWsRestApplication.java:11) ~[clea-ws-rest:0-SNAPSHOT]
Caused by: com.oracle.svm.core.jdk.UnsupportedFeatureError: Unsupported method java.lang.Class.isSealed() is reachable: The declaring class of this element has been substituted, but this element is not present in the substitution class
at com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:87) ~[na:na]
at java.lang.Class.isSealed(DynamicHub.java:4563) ~[clea-ws-rest:na]
at java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[na:na]
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:266) ~[na:na]
at org.springframework.aop.framework.AopProxyUtils.completeProxiedInterfaces(AopProxyUtils.java:146) ~[na:na]
at org.springframework.aop.framework.JdkDynamicAopProxy.<init>(JdkDynamicAopProxy.java:111) ~[na:na]
at org.springframework.aop.framework.DefaultAopProxyFactory.createAopProxy(DefaultAopProxyFactory.java:55) ~[na:na]
at org.springframework.aop.framework.ProxyCreatorSupport.createAopProxy(ProxyCreatorSupport.java:105) ~[na:na]
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110) ~[na:na]
at org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver.buildLazyResolutionProxy(ContextAnnotationAutowireCandidateResolver.java:130) ~[na:na]
at org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver.getLazyResolutionProxyIfNecessary(ContextAnnotationAutowireCandidateResolver.java:54) ~[na:na]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1306) ~[na:na]
at org.springframework.aot.beans.factory.InjectedConstructionResolver.lambda$resolve$0(InjectedConstructionResolver.java:83) ~[na:na]
at org.springframework.aot.beans.factory.InjectedConstructionResolver.resolveDependency(InjectedConstructionResolver.java:97) ~[na:na]
at org.springframework.aot.beans.factory.InjectedConstructionResolver.resolve(InjectedConstructionResolver.java:83) ~[na:na]
at org.springframework.aot.beans.factory.InjectedElementResolver.resolve(InjectedElementResolver.java:35) ~[na:na]
at org.springframework.aot.beans.factory.InjectedElementResolver.create(InjectedElementResolver.java:66) ~[na:na]
at org.springframework.aot.beans.factory.BeanDefinitionRegistrar$BeanInstanceContext.create(BeanDefinitionRegistrar.java:211) ~[na:na]
at org.springframework.aot.ContextBootstrapInitializer.lambda$initialize$39(ContextBootstrapInitializer.java:378) ~[na:na]
at org.springframework.aot.beans.factory.BeanDefinitionRegistrar$ThrowableFunction.apply(BeanDefinitionRegistrar.java:294) ~[na:na]
at org.springframework.aot.beans.factory.BeanDefinitionRegistrar.lambda$instanceSupplier$0(BeanDefinitionRegistrar.java:115) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1249) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1191) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[na:na]
我在 pom.xml 中使用以下依賴項:
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>0.12.0</version>
</dependency>
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot</artifactId>
<version>0.12.0</version>
</dependency>
這些插件:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.0</version>
<configuration>
<image>
<builder>paketobuildpacks/builder:tiny</builder>
<env>
<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
</env>
</image>
<classifier>exec</classifier>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>0.12.0</version>
</plugin>
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>0.12.0</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
以及用于構建本機映像的這些組態檔:
<profile>
<id>native</id>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>0.9.11</version>
<executions>
<execution>
<id>build-native</id>
<goals>
<goal>build</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
</profile>
要構建影像,我使用這些命令列:
mvn package -Pnative或mvn package spring-boot:build-image;然后,結果出現在 /target 目錄中,我./target/myApp用來運行它。
這是結果java --version:
openjdk 17.0.3 2022-04-19
OpenJDK Runtime Environment GraalVM CE 21.3.2 (build 17.0.3 7-jvmci-21.3-b14)
OpenJDK 64-Bit Server VM GraalVM CE 21.3.2 (build 17.0.3 7-jvmci-21.3-b14, mixed mode, sharing)
我在 github 上發現了這個問題,這似乎與我的非常相似,如果不完全相同的話。票已關閉,但我不明白解決方案。
該錯誤似乎與與環境相關的組態檔(dev,prod,test ...)有關。Spring Native 檔案的一部分專門針對這一方面。為了解決這個錯誤,我在組態檔中填寫了一個application.yml組態檔。組態檔在運行時正確加載,但錯誤相同。
錯誤不會來自jdk和Spring庫之間的兼容性問題嗎?但是,在 javadoc中,該方法從 jdk 版本 17 開始存在。
提前致謝
uj5u.com熱心網友回復:
從您鏈接的github 問題中,我們可以看到解決方案是在 GraalVM 中的密封類上添加反射支持。
這通過以下拉取請求合并到 master 。
在GraalVM 發行說明中,我們可以看到這使其成為版本22.0.0及更高版本的發行版。
22.0.0 (2021-01-18)
這個日期好像不對,應該是2022-01-18
添加了對 JDK 17 上密封類的反射自省的支持:Class.isSealed() 和 Class.getPermittedSubclasses()。
您當前的 JDK 使用的是 GraalVM 21.3.2,因此尚不包含此修復程式。解決方案是找到具有 GraalVM 22.x 或更高版本的 JDK 構建。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/498138.html
標籤:爪哇 弹簧靴 行家 graalvm-native-image 春天原生
上一篇:無法從類加載器層次結構中掃描[jar:file:/app.jar!/BOOT-INF/lib/spring-webmvc-5.2.5.RELEASE.jar!/]
