SpringBoot Gradle+Log4j2可执行JAR无法加载主类求助
问题分析与解决办法
问题出在哪
- 自定义的
jar任务和Spring Boot自带的bootJar冲突,手动打包的JAR并非标准Spring Boot可执行包,类加载逻辑不符合要求,导致主类找不到。 - 删除自定义jar任务后,默认bootJar能运行,但日志依赖配置错误,导致Log4j2失效。
- 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
相关产品推荐
相关产品推荐

