从Maven迁移至Gradle后Spring Boot生成jar启动报错:属性绑定失败
你的报错核心是server.error.include-stacktrace属性绑定失败,结合Maven和Gradle配置的差异,一共存在4处错误,按优先级修改即可:
1. 版本不统一导致属性绑定失败
你在Gradle中对所有Spring Boot Starter用了+通配符拉取最新版本,但Maven中固定继承了spring-boot-starter-parent 2.4.3:
- Spring Boot 2.3+版本后
server.error.include-stacktrace从布尔值类型改为了IncludeAttribute枚举,可选值为always/on_trace_param/never - 如果你配置文件中写的是旧版的
true/false,或者拉取的Spring Boot版本和配置逻辑不匹配,就会直接抛出绑定异常 - 同时引入
spring-boot-starter-web和spring-boot-starter-webflux时,跨版本依赖还会引发容器初始化冲突
修复方案:
在build.gradle头部引入Spring Boot官方插件,和Maven保持版本一致,所有官方Starter自动继承版本,无需手动指定:
plugins { id 'org.springframework.boot' version '2.4.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' }
之后把所有Spring Boot Starter、postgresql等官方托管依赖的版本号(包括+号)全部删掉,由插件统一管理版本。
2. Lombok依赖配置错误
Maven中Lombok的scope是provided,编译时生效,但你在Gradle中写成了runtimeOnly(仅运行时生效),会导致所有Lombok注解编译时不生效:
修复方案:替换原有lombok配置为:
compileOnly 'org.projectlombok:lombok:1.18.20' annotationProcessor 'org.projectlombok:lombok:1.18.20'
3. 测试依赖打入生产包
你把spring-boot-starter-test放到了implementation依赖中,而Maven中仅为test scope,测试依赖中包含的测试配置类会污染生产环境上下文:
修复方案:删除implementation 'org.springframework.boot:spring-boot-starter-test:+'这一行,仅保留testImplementation声明的测试依赖即可。
4. 缺少Spring Boot打包插件
Maven中配置了spring-boot-maven-plugin用来生成可执行jar,Gradle中也需要对应配置才能生成正确的可执行jar结构:
修复方案:添加完第一步的插件后,在build.gradle中补充打包配置即可:
bootJar { mainClass.set('你的启动类全限定名,比如com.xxx.Application') }
内容的提问来源于stack exchange,提问作者Yashesh

