Gradle多模块项目中Interceptor无法检测CommonUtils的外部依赖
Gradle多模块项目编译错误排查
项目结构
执行gradle projects命令得到如下结构:
gradle projects
CommonUtils为独立模块,Interceptor模块依赖CommonUtils。
Root project 'main-project' +--- Project ':CommonUtils' +--- Project ':Interceptor' \--- Project ':SearchService'
问题现象
- 主项目执行
gradle build时,报错:
Task :Interceptor:compileJava FAILED
- IntelliJ中无法识别以下两个导入语句:
import com.google.gson.Gson;import com.rometools.rome.feed.rss.Channel;
模块配置文件
CommonUtils的build.gradle
plugins { id 'org.springframework.boot' version '2.2.0.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' id 'java' } bootJar{ enabled=false } jar{ enabled=true } ext { set('springCloudVersion', "Hoxton.SR1") } processResources { def profile = (project.hasProperty('profile') ? project.profile : 'local').toLowerCase() include "**/" rename "bootstrap-${profile}.properties","bootstrap.properties" include "bootstrap.properties" } dependencies { implementation 'com.itextpdf:itextpdf:5.5.13.3' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-config:2.2.0.RELEASE' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.755') implementation 'com.amazonaws:aws-java-sdk-s3' implementation 'com.amazonaws:aws-java-sdk-elasticsearch' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'com.amazonaws:aws-java-sdk-sns:1.11.847' implementation 'com.amazonaws:amazon-sqs-java-messaging-lib:1.0.4' implementation 'org.springframework.boot:spring-boot-starter-mail:2.2.0.RELEASE' implementation 'org.json:json:20160810' implementation 'com.googlecode.json-simple:json-simple:1.1' implementation 'com.google.code.gson:gson:2.8.2' implementation 'mysql:mysql-connector-java:8.0.13' implementation 'com.oracle.ojdbc:xmlparserv2:19.3.0.0' implementation 'org.jsoup:jsoup:1.13.1' implementation group: 'com.github.dozermapper', name: 'dozer-core', version: '6.5.0' implementation group: 'com.github.dozermapper', name: 'dozer-spring-boot-starter', version: '6.5.0' implementation group: 'com.itextpdf', name: 'itext7-core', version: '7.1.10', ext: 'pom' implementation group: 'com.itextpdf', name: 'html2pdf', version: '2.1.7' implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2' implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator' implementation group: 'io.micrometer', name: 'micrometer-registry-elastic', version: '1.1.4' implementation 'com.rometools:rome:1.18.0' implementation fileTree(dir: 'libs', include: '*.jar') implementation 'org.projectlombok:lombok:1.18.24' implementation 'rome:rome:1.0' annotationProcessor 'org.projectlombok:lombok:1.18.24' runtimeOnly('mysql:mysql-connector-java') testImplementation('org.springframework.boot:spring-boot-starter-test') } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } }
Interceptor的build.gradle
plugins { id 'org.springframework.boot' version '2.2.0.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' id 'java' } bootJar{ enabled=false } jar{ enabled=true } dependencies { implementation project(':CommonUtils') implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'org.apache.commons:commons-io:1.3.2' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'javax.servlet:javax.servlet-api:3.1.0' }
解决方案
问题根源在于Gradle的依赖配置作用域:CommonUtils中使用implementation声明的依赖,只会在自身编译时可见,不会传递给依赖它的Interceptor模块。而Interceptor中直接使用了CommonUtils依赖的Gson和Rome库,因此需要将这两个依赖的作用域改为api,让依赖可以向下传递。
修改CommonUtils的build.gradle中对应的依赖声明:
// 替换原来的implementation为api api 'com.google.code.gson:gson:2.8.2' api 'com.rometools:rome:1.18.0'
同时注意CommonUtils中重复声明了rome:rome:1.0,建议移除该冗余依赖,避免版本冲突。
修改完成后,重新执行gradle clean build即可解决编译错误,IntelliJ中的导入识别问题也会同步修复。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

