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

Spring Boot 3.1.x原生编译Log4j2遇NoSuchMethodException求助

问题

我使用Gradle插件将Spring Boot 3应用编译为Native Image,编译命令如下:

./gradlew bootBuildImage --imageName=example.com/library/my-app:v1

运行镜像的命令:

docker run --rm -p 5050:5050 example.com/library/my-app:v1

在Spring Boot 3.0.8版本下一切正常,但切换到3.1.0或3.1.1版本后,启动镜像时出现如下异常:

Exception in thread "main" java.lang.ExceptionInInitializerError
        at org.apache.logging.slf4j.Log4jMarkerFactory.<clinit>(Log4jMarkerFactory.java:36)
        at org.apache.logging.slf4j.SLF4JServiceProvider.initialize(SLF4JServiceProvider.java:53)
        at org.slf4j.LoggerFactory.bind(LoggerFactory.java:183)
        at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:170)
        at org.slf4j.LoggerFactory.getProvider(LoggerFactory.java:455)
        at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:441)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:390)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:416)
        at com.example.messaging.Application.<clinit>(Application.java:13)
Caused by: java.lang.IllegalStateException: java.lang.InstantiationException: org.apache.logging.log4j.message.DefaultFlowMessageFactory
        at org.apache.logging.log4j.spi.AbstractLogger.createDefaultFlowMessageFactory(AbstractLogger.java:242)
        at org.apache.logging.log4j.spi.AbstractLogger.<init>(AbstractLogger.java:141)
        at org.apache.logging.log4j.status.StatusLogger.<init>(StatusLogger.java:141)
        at org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:91)
        ... 9 more
Caused by: java.lang.InstantiationException: org.apache.logging.log4j.message.DefaultFlowMessageFactory
        at java.base@17.0.7/java.lang.Class.newInstance(DynamicHub.java:639)
        at org.apache.logging.log4j.spi.AbstractLogger.createDefaultFlowMessageFactory(AbstractLogger.java:240)
        ... 12 more
Caused by: java.lang.NoSuchMethodException: org.apache.logging.log4j.message.DefaultFlowMessageFactory.<init>()
        at java.base@17.0.7/java.lang.Class.checkMethod(DynamicHub.java:1040)
        at java.base@17.0.7/java.lang.Class.getConstructor0(DynamicHub.java:1206)
        at java.base@17.0.7/java.lang.Class.newInstance(DynamicHub.java:626)
        ... 13 more

异常提示org.apache.logging.log4j.message.DefaultFlowMessageFactory没有默认构造方法,但我查看源码确认这个构造方法是存在的。已经查阅相关Issue但没找到有效解决办法,请问可能是什么原因?

可能的原因及解决方案

这个问题核心是Native Image编译时缺失了目标类的反射元数据——哪怕源码里存在构造方法,Native Image如果没提前生成对应的元数据,运行时就会找不到这个构造方法。Spring Boot 3.1.x升级了Log4j相关依赖,导致之前自动生成的元数据覆盖不到这个类。以下是几种解决办法:

  • 手动添加Native Image反射配置文件
    在项目的src/main/resources/META-INF/native-image目录下创建reflect-config.json,添加对DefaultFlowMessageFactory的反射配置:

    [
      {
        "name": "org.apache.logging.log4j.message.DefaultFlowMessageFactory",
        "constructors": [
          {
            "name": "<init>",
            "parameterTypes": []
          }
        ]
      }
    ]
    

    这样编译Native Image时就会为这个类的默认构造方法生成反射元数据。

  • 用Spring Boot的Native Hints注解自动配置
    创建一个Spring配置类,通过@NativeHint指定需要反射的类:

    import org.springframework.aot.hint.AccessBits;
    import org.springframework.aot.hint.annotation.NativeHint;
    import org.springframework.aot.hint.annotation.TypeHint;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @NativeHint(
      types = @TypeHint(
        type = org.apache.logging.log4j.message.DefaultFlowMessageFactory.class,
        access = AccessBits.CONSTRUCTORS
      )
    )
    public class NativeImageReflectionConfig {
    }
    

    Spring Boot在生成Native Image配置时会自动识别这个注解,把目标类的构造方法加入元数据。

  • 排查依赖版本冲突
    用./gradlew dependencies查看项目依赖树,确认是否有第三方依赖引入了旧版本的Log4j,导致类加载时出现版本不一致的问题。确保项目中Log4j的版本和Spring Boot 3.1.x内置的版本完全一致。

  • 升级到Spring Boot 3.1.2及以上版本
    Spring Boot后续版本已经修复了部分Native Image和Log4j集成的问题,升级到3.1.2或更高版本后,重新构建镜像可能就能解决这个问题。

内容的提问来源于stack exchange,提问作者la00

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:55:08