使用GraalVM编译Native Image时遇NoSuchMethodException错误求助
问题:GraalVM编译Spring Boot应用后执行报错:AutoConfigurationPackages$Registrar无默认构造方法
错误日志
2024-02-07 14:37:13.007 [ERROR] [main] org.springframework.boot.SpringApplication - Application run failed org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [cn.demo.start.ZsyStartApplication]: Failed to instantiate [org.springframework.boot.autoconfigure.AutoConfigurationPackages$Registrar]: No default constructor found at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:524) at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:304) at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:243) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:192) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167) at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:415) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:287) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:344) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:145) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:771) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:589) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436) at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) at cn.hyperchain.zsy.start.ZsyStartApplication.main(ZsyStartApplication.java:18) Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.AutoConfigurationPackages$Registrar]: No default constructor found at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) at org.springframework.context.annotation.ParserStrategyUtils.createInstance(ParserStrategyUtils.java:86) at org.springframework.context.annotation.ParserStrategyUtils.instantiateClass(ParserStrategyUtils.java:65) at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:505) ... 17 common frames omitted Caused by: java.lang.NoSuchMethodException: org.springframework.boot.autoconfigure.AutoConfigurationPackages$Registrar.<init>() at java.base@17.0.10/java.lang.Class.checkMethod(DynamicHub.java:1038) at java.base@17.0.10/java.lang.Class.getConstructor0(DynamicHub.java:1204) at java.base@17.0.10/java.lang.Class.getDeclaredConstructor(DynamicHub.java:2754) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) ... 20 common frames omitted
环境与版本信息
windows 10 graalvm 23.0.3 native-image 23.0.3 springboot 3.1.2
已尝试的配置
在reflect-config.json中添加了外部类配置,但未生效:
{ "name": "org.springframework.boot.autoconfigure.AutoConfigurationPackages", "allDeclaredFields": true, "allDeclaredConstructors": true, "allDeclaredMethods": true, "allPublicMethods": true, "allDeclaredClasses": true }
解决方案
1. 修正反射配置,添加内部类的反射规则
报错的是AutoConfigurationPackages的内部类Registrar,当前配置仅覆盖外部类,需单独为内部类添加反射规则:
{ "name": "org.springframework.boot.autoconfigure.AutoConfigurationPackages$Registrar", "allDeclaredConstructors": true, "allDeclaredMethods": true }
注意:GraalVM反射配置中,内部类需用$连接外部类与内部类名称,不能使用.。
2. 使用Spring Boot Native插件自动生成配置(推荐)
手动维护反射配置易遗漏依赖类,建议改用Spring Boot官方Native插件,它会自动扫描应用依赖与运行时需求,生成正确的GraalVM配置文件:
Maven项目配置
在pom.xml中添加Spring Boot Maven插件:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.1.2</version> <configuration> <native> <buildArgs>--no-fallback</buildArgs> </native> </configuration> </plugin> </plugins> </build>
执行编译命令:
mvn native:compile
Gradle项目配置
在build.gradle中添加插件:
plugins { id 'org.springframework.boot' version '3.1.2' id 'io.spring.dependency-management' version '1.1.2' id 'java' id 'org.graalvm.buildtools.native' version '0.9.22' }
执行编译命令:
./gradlew nativeCompile
3. 版本兼容性检查
当前版本组合(Spring Boot 3.1.2 + GraalVM 23.0.3)属于官方兼容范围,若上述方案无效,可尝试:
- 升级GraalVM到23.1.x版本,修复部分Native镜像构建问题
- 升级Spring Boot到3.1.x最新小版本(如3.1.5),修复部分Auto配置相关的Native镜像bug
内容的提问来源于stack exchange,提问作者Jerry Ma
相关产品推荐
相关产品推荐

