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

Spring Boot可通过mvn启动但IntelliJ运行主类报错

问题分析与解决方案

背景信息

  • 开发环境:IntelliJ Community 2020.2.4,Maven构建Spring Boot 2.7.10 Web应用(项目名main-app),OpenJDK 11.0.18
  • 日志配置:替换Spring Boot默认的Logback为Log4j 1.x
    • core项目(编译为core.jar):pom.xml中排除spring-boot-starter-logging,引入spring-boot-starter-log4j:1.2.5.RELEASE
    • main-app项目:pom.xml引入core依赖,同时排除spring-boot-starter-web中的spring-boot-starter-logging
  • 异常现象:通过mvn spring-boot:run启动应用正常,IntelliJ远程调试也没问题,但直接在IntelliJ中运行ApplicationMain.java的main方法时,抛出ClassCastException: org.apache.logging.slf4j.SLF4JLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext,导致Spring Boot启动失败

原因

IntelliJ直接运行main方法时,类加载路径与Maven命令行的依赖加载顺序不一致:

  • Maven命令行启动会严格按照pom.xml的依赖规则处理日志组件,保证Log4j 1.x相关类优先加载
  • IntelliJ构建运行环境时,可能提前加载了SLF4J绑定的Log4j2相关类(比如org.apache.logging.slf4j.SLF4JLoggerContext),和你配置的Log4j 1.x产生类转换冲突

解决办法

办法1:让IntelliJ委托Maven处理构建和运行

  • 打开IntelliJ的File > Settings > Build, Execution, Deployment > Build Tools > Maven > Runner
  • 勾选Delegate IDE build/run actions to Maven选项
  • 重启IntelliJ后再运行main方法,此时会和Maven命令行的依赖处理逻辑一致

办法2:彻底排除冲突的日志依赖

在main-app的pom.xml中,不仅排除默认日志 starter,还要主动排除所有混入的Log4j2相关依赖:

<dependencies>
    <!-- core项目依赖 -->
    <dependency>
        <groupId>你的core项目groupId</groupId>
        <artifactId>core</artifactId>
        <version>对应版本号</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j-impl</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- Spring Boot Web依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j-impl</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- 显式引入Log4j 1.x依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j</artifactId>
        <version>1.2.5.RELEASE</version>
    </dependency>
</dependencies>

办法3:调整IntelliJ运行配置

  • 打开Run > Edit Configurations,找到对应ApplicationMain的运行配置
  • 在VM options中添加参数,指定日志加载规则:
    -Dlog4j.configuration=classpath:log4j.properties
    -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=OFF
    
  • 切换到Classpath标签页,将Log4j 1.x相关的jar包调整到类路径最上方,确保优先加载

内容的提问来源于stack exchange,提问作者Bằng Rikimaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:38:34