从Spring Boot 1.5.10迁移到2.0.0后Gradle依赖解析失败原因咨询
这事儿得从Spring Boot Gradle插件的版本差异说起,Spring Boot 1.5和2.0在依赖管理的逻辑上有个关键变化,直接导致了你遇到的问题:
Spring Boot 1.5的Gradle插件自动帮你管版本
当你用1.5版本的org.springframework.boot插件时,它会偷偷帮你导入Spring Boot的依赖BOM(可以理解为一个统一的版本清单)。这个BOM里预设了所有Spring生态常用依赖的对应版本,所以你写compile 'org.springframework.boot:spring-boot-starter-web'这类依赖时,完全不用加版本号,插件会自动匹配和当前Spring Boot版本兼容的依赖版本。Spring Boot 2.0的Gradle插件不再默认管版本了
到了2.0版本,官方对Gradle插件做了重构,不再默认启用依赖管理功能。如果还想像1.5那样省略版本号,你需要显式应用io.spring.dependency-management插件,让它帮你导入Spring Boot的BOM。要是没做这一步,Gradle根本不知道这些依赖该用哪个版本,自然就会抛出找不到版本的构建错误。手动加版本号能解决问题的原因
当你给每个依赖加上具体版本号后,Gradle就不需要依赖插件提供的版本管理机制了,直接用你指定的版本去仓库拉取依赖,构建自然就正常了。不过这种方式不够优雅,毕竟手动维护版本号容易出现版本不兼容的问题。
正确的Spring Boot 2.0 + Gradle配置(不用手动加版本号)
如果你想回到1.5那种省心的状态,可以在build.gradle里这么配置:
plugins { id 'org.springframework.boot' version '2.0.0.RELEASE' id 'io.spring.dependency-management' version '1.0.7.RELEASE' // 必须显式加这个插件 id 'java' } dependencies { // 这里可以放心省略版本号了 implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' }
另外提个小细节:Spring Boot 2.0开始推荐用implementation代替旧的compile配置,这是Gradle自身的Java Library插件带来的变化,能让依赖的可见性更合理,建议同步调整。
内容的提问来源于stack exchange,提问作者leventunver

