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

SpringBoot Gradle+Log4j2可执行JAR无法加载主类求助

问题分析与解决办法

问题出在哪

  1. 自定义的jar任务和Spring Boot自带的bootJar冲突,手动打包的JAR并非标准Spring Boot可执行包,类加载逻辑不符合要求,导致主类找不到。
  2. 删除自定义jar任务后,默认bootJar能运行,但日志依赖配置错误,导致Log4j2失效。
  3. JDBC本地文件依赖与Maven仓库依赖重复,可能引发类加载冲突。

一步步解决

1. 删除自定义jar配置,用Spring Boot官方的bootJar

Spring Boot的bootJar会自动打包成符合规范的可执行JAR,主类、类路径无需手动配置。直接删除以下代码块:

tasks.withType(Jar) {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE

    manifest {
        attributes["Main-Class"] = "com.quartz.QuartzSchedulerApplication"
    }
}

jar {
    enabled = true
    archiveClassifier = ''

    manifest {
        attributes 'Main-Class' : "com.quartz.QuartzSchedulerApplication"
    }

    from {
        configurations.runtimeClasspath.collect {it.isDirectory() ? it : zipTree(it)}
    }
}

你的主类标注了@SpringBootApplication注解,Spring Boot会自动识别主类,无需额外指定。

2. 修复Log4j2依赖冲突

Spring Boot默认使用SLF4J+Logback,切换到Log4j2需要先排除Logback,再引入官方的Log4j2 Starter,避免零散依赖引发冲突。修改dependencies块:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-quartz'
    // 排除web starter中的Logback依赖
    implementation('org.springframework.boot:spring-boot-starter-web') {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
    // 引入Log4j2官方Starter,包含所有必要依赖
    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    // 移除本地JDBC文件依赖,使用Maven仓库的版本即可,避免重复
    runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

注意:spring-boot-starter-log4j2已包含log4j-api、log4j-core、log4j-slf4j-impl,无需单独引入这些依赖。

3. 添加Log4j2配置文件

在src/main/resources下新建log4j2.xml配置文件,示例如下,确保日志正常输出:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

4. 打包并运行应用

执行构建命令:

./gradlew clean bootJar

前往build/libs目录找到生成的JAR文件,运行:

java -jar build/libs/QuartzScheduler-0.0.1-SNAPSHOT.jar

补充说明

  • 之前用java -cp命令运行失败是正常的,自定义打包的JAR不符合Spring Boot类加载规范,Spring Boot可执行JAR必须用java -jar启动,或直接用./gradlew bootRun运行项目。
  • 删除自定义jar任务后,bootJar会自动打包所有依赖(包括JDBC驱动),无需手动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:00:05