You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:50:29