SpringBoot 3.3.1 Native构建报错:ValueCodeGenerationException排查
异常触发原因分析
配置信息
<profile> <id>native</id> <build> <plugins> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <executions> <execution> <id>build-native</id> <goals> <goal>compile-no-fork</goal> </goals> <phase>package</phase> </execution> </executions> <configuration> <skipNativeTests>true</skipNativeTests> </configuration> </plugin> </plugins> </build> </profile>
构建命令
mvn clean package -Pnative
异常信息
Exception in thread "main" org.springframework.aot.generate.ValueCodeGenerationException: Failed to generate code for 'org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@5cdd09b1, started on Tue Jul 16 08:39:11 CEST 2024' with type class org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext at org.springframework.aot.generate.ValueCodeGenerator.generateCode(ValueCodeGenerator.java:116) at org.springframework.beans.factory.aot.BeanDefinitionPropertiesCodeGenerator.generateValue(BeanDefinitionPropertiesCodeGenerator.java:269) at org.springframework.beans.factory.aot.BeanDefinitionPropertiesCodeGenerator.addPropertyValues(BeanDefinitionPropertiesCodeGenerator.java:228) at org.springframework.beans.factory.aot.BeanDefinitionPropertiesCodeGenerator.generateCode(BeanDefinitionPropertiesCodeGenerator.java:135) at org.springframework.beans.factory.aot.DefaultBeanRegistrationCodeFragments.generateSetBeanDefinitionPropertiesCode(DefaultBeanRegistrationCodeFragments.java:182) at org.springframework.beans.factory.aot.BeanRegistrationCodeGenerator.generateCode(BeanRegistrationCodeGenerator.java:81) at org.springframework.beans.factory.aot.BeanDefinitionMethodGenerator.lambda$generateBeanDefinitionMethod$3(BeanDefinitionMethodGenerator.java:176) at org.springframework.aot.generate.GeneratedMethod.<init>(GeneratedMethod.java:54) at org.springframework.aot.generate.GeneratedMethods.add(GeneratedMethods.java:112) at org.springframework.aot.generate.GeneratedMethods.add(GeneratedMethods.java:89) at org.springframework.beans.factory.aot.BeanDefinitionMethodGenerator.generateBeanDefinitionMethod(BeanDefinitionMethodGenerator.java:169) at org.springframework.beans.factory.aot.BeanDefinitionMethodGenerator.generateBeanDefinitionMethod(BeanDefinitionMethodGenerator.java:94) at org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.lambda$generateRegisterBeanDefinitionsMethod$2(BeanRegistrationsAotContribution.java:90) at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721) at org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.generateRegisterBeanDefinitionsMethod(BeanRegistrationsAotContribution.java:88) at org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.lambda$applyTo$1(BeanRegistrationsAotContribution.java:73) at org.springframework.aot.generate.GeneratedMethod.<init>(GeneratedMethod.java:54) at org.springframework.aot.generate.GeneratedMethods.add(GeneratedMethods.java:112) at org.springframework.aot.generate.GeneratedMethods.add(GeneratedMethods.java:89) at org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.applyTo(BeanRegistrationsAotContribution.java:72) at org.springframework.context.aot.BeanFactoryInitializationAotContributions.applyTo(BeanFactoryInitializationAotContributions.java:78) at org.springframework.context.aot.ApplicationContextAotGenerator.lambda$processAheadOfTime$0(ApplicationContextAotGenerator.java:58) at org.springframework.context.aot.ApplicationContextAotGenerator.withCglibClassHandler(ApplicationContextAotGenerator.java:67) at org.springframework.context.aot.ApplicationContextAotGenerator.processAheadOfTime(ApplicationContextAotGenerator.java:53) at org.springframework.context.aot.ContextAotProcessor.performAotProcessing(ContextAotProcessor.java:106) at org.springframework.context.aot.ContextAotProcessor.doProcess(ContextAotProcessor.java:84) at org.springframework.context.aot.ContextAotProcessor.doProcess(ContextAotProcessor.java:49) at org.springframework.context.aot.AbstractAotProcessor.process(AbstractAotProcessor.java:82) at org.springframework.boot.SpringApplicationAotProcessor.main(SpringApplicationAotProcessor.java:80) Caused by: org.springframework.aot.generate.UnsupportedTypeValueCodeGenerationException: Code generation does not support org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext at org.springframework.aot.generate.ValueCodeGenerator.generateCode(ValueCodeGenerator.java:113) ... 28 more
使用环境
- SpringBoot: 3.3.1
- Maven: 3.9.1
- Java: graalvm-jdk-17.0.11+7.1
异常触发原因
核心原因是代码中将AnnotationConfigServletWebServerApplicationContext实例作为Bean的属性注入,或是在Bean定义里直接引用了该容器实例。
Spring AOT(提前编译)在生成Native镜像所需代码时,无法为AnnotationConfigServletWebServerApplicationContext这类Spring核心容器类型生成初始化代码——它是用来管理Bean的容器本身,不应该被当作普通Bean的属性来使用。
常见错误场景比如:代码里写了@Autowired private AnnotationConfigServletWebServerApplicationContext context;,或是在@Bean方法中直接返回该context实例。这种用法会导致AOT代码生成时出现无法处理的循环依赖或初始化逻辑问题,最终抛出异常。
只需要检查代码,移除所有将ApplicationContext实例作为Bean属性或直接在Bean定义中引用的逻辑,即可解决问题。
内容的提问来源于stack exchange,提问作者asgarov1
相关产品推荐
相关产品推荐

