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

GraalVM构建Native镜像时LogFactory初始化异常的解决方法

解决Spring Boot Native镜像构建时commons-logging冲突与初始化失败问题

1. 排除commons-logging传递依赖并替换为SLF4J桥接

commons-logging与SLF4J的类路径冲突是核心诱因之一,需要移除commons-logging并使用jcl-over-slf4j桥接,将commons-logging的日志调用转向SLF4J。

在pom.xml中添加以下配置:

<!-- 全局排除commons-logging传递依赖 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 引入SLF4J桥接commons-logging -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>

或者针对单个Spring依赖排除(比如spring-core):

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. 补充SLF4J日志实现

解决SLF4J无提供者警告,引入Spring Boot默认的Logback实现:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

3. 延迟冲突类的初始化时机

Native镜像构建阶段意外初始化LogFactory和LogFactoryService会导致失败,需要配置这些类在运行时才初始化。

方式一:通过Maven插件配置

在pom.xml的spring-boot-maven-plugin中添加Native镜像构建参数:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <nativeImage>
                    <buildArgs>
                        --initialize-at-run-time=org.apache.commons.logging.LogFactory,org.apache.commons.logging.LogFactoryService
                    </buildArgs>
                </nativeImage>
            </configuration>
        </plugin>
    </plugins>
</build>

方式二:通过@NativeHint注解

在Spring Boot主类上添加注解,指定类的初始化时机:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.nativex.hint.InitializationHint;
import org.springframework.nativex.hint.NativeHint;
import org.springframework.nativex.hint.InitializationTime;

@SpringBootApplication
@NativeHint(
    initializationHints = {
        @InitializationHint(
            typeNames = {"org.apache.commons.logging.LogFactory", "org.apache.commons.logging.LogFactoryService"},
            initializationTime = InitializationTime.RUN
        )
    }
)
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

4. 清理缓存后重新构建

清理Maven和GraalVM缓存,避免旧依赖或缓存文件干扰:

./mvnw clean
rm -rf ~/.m2/repository/org/springframework/boot/spring-boot-loader/
rm -rf ~/.cache/graalvm/

重新执行构建命令:

./mvnw -Pnative spring-boot:build-image

内容的提问来源于stack exchange,提问作者Đỗ Như Vỹ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:52:31