Gradle构建中spring-boot-starter-webflux依赖问题排查求助
你遇到的问题核心是依赖冲突和Gradle Lint插件的误判:spring-boot-starter-webflux会间接引入jakarta.annotation-api,而父模块Par已经显式声明了javax.annotation-api——这两个包是Java EE到Jakarta EE迁移的产物,类完全重复,触发了Lint的重复依赖检测;同时Lint还误判了部分依赖未声明或未使用。
下面是一步步的解决方案:
1. 排除WebFlux中的Jakarta依赖
首先在Child模块的spring-boot-starter-webflux依赖中排除jakarta.annotation-api,让整个项目统一使用父模块的javax.annotation-api版本,彻底解决重复依赖问题。
修改Child模块build.gradle中的webflux依赖:
compile group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: versions.spring_boot, { exclude group: 'jakarta.annotation', module: 'jakarta.annotation-api' }
2. 处理Lint的误报问题
排除Jakarta依赖后,Lint可能还会报undeclared-dependency或unused-dependency错误,这是插件对WebFlux的依赖结构判断有误。你可以在Child模块的gradleLint.ignore块中添加规则忽略这些误报:
gradleLint.ignore { // 忽略webflux的未使用依赖误报 unused-dependency 'org.springframework.boot:spring-boot-starter-webflux' // 如果仍有undeclared错误,添加这条规则 undeclared-dependency 'jakarta.annotation:jakarta.annotation-api' }
3. 验证依赖树(可选但推荐)
执行以下命令查看Child模块的依赖树,确认jakarta.annotation-api已经被排除,只有javax.annotation-api存在:
gradle :Child:dependencies
这能帮你确认依赖冲突已经彻底解决。
完整修改后的Child模块依赖示例
调整后的Child模块dependencies节点完整代码:
dependencies { compile nerv('grpc-helpers-java', versions.grpc_helpers_java) compile group: 'org.springframework', name: 'spring-core', version: versions.spring compile group: 'org.springframework', name: 'spring-beans', version: versions.spring compile group: 'org.springframework', name: 'spring-context', version: versions.spring compile group: 'org.springframework', name: 'spring-web', version: versions.spring compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version:'2.10.5' compile group: 'com.fasterxml.jackson.core',name:'jackson-core', version:'2.10.5' compile group: 'com.fasterxml.jackson.core', name:'jackson-databind', version:'2.10.5' compile group: 'org.slf4j', name: 'slf4j-api', version: versions.slf4j // 排除jakarta依赖,统一使用javax版本 compile group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: versions.spring_boot, { exclude group: 'jakarta.annotation', module: 'jakarta.annotation-api' } runtime group: 'org.slf4j', name: 'slf4j-log4j12', version: versions.slf4j gradleLint.ignore { // 保留原有的spring-web忽略规则 compile group: 'org.springframework', name: 'spring-web', version: versions.spring // 添加webflux的未使用依赖忽略 unused-dependency 'org.springframework.boot:spring-boot-starter-webflux' } }
这样调整后,父模块的lintGradle任务应该能正常通过,同时Child模块的WebClient也能正常使用。
内容的提问来源于stack exchange,提问作者lightrek

