Spring Boot+Gradle多模块下web模块无法访问core模块JpaRepository问题
问题根因
你遇到的编译错误是Gradle依赖传递规则导致的:
- Gradle中
implementation配置声明的依赖仅作用于当前模块的编译期,不会传递到依赖该模块的下游项目的编译classpath中,仅会在运行期加载。你在demo-core模块中用implementation声明了spring-boot-starter-data-jpa依赖,所以该依赖里的JpaRepository类只能在demo-core模块的编译期被访问,demo-web模块编译时无法读取到该类。 - 封装
CustomerFinder后可正常运行的原因是:你调用CustomerFinder的公开方法时,方法签名没有暴露任何JpaRepository相关的类型,demo-web编译阶段不需要加载JpaRepository类,运行期所有依赖都会加载,因此不会报错。
解决方案
有两种可行的修复方式,按需选择即可:
方案1:修改demo-core的依赖传递规则
如果希望demo-core的JPA相关依赖自动传递给下游模块,可将implementation改为api配置:
- 首先在demo-core的
build.gradle中引入java-library插件(api配置由该插件提供):
// 替换原有apply plugin: 'java' apply plugin: 'java-library' group 'com.example' version '0.0.1-SNAPSHOT' repositories { mavenCentral() } dependencies { implementation 'com.h2database:h2:1.4.200' // 替换原有implementation为api api 'org.springframework.boot:spring-boot-starter-data-jpa:2.5.3' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' } test { useJUnitPlatform() }
修改后重新构建项目即可解决编译错误。
方案2:demo-web显式引入JPA依赖
如果不希望修改demo-core的依赖传递规则,可直接在demo-web的build.gradle中单独添加spring-boot-starter-data-jpa依赖:
plugins { id 'org.springframework.boot' version '2.5.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group 'com.example' version '0.0.1-SNAPSHOT' repositories { mavenCentral() } dependencies { implementation project(':demo-core') implementation 'org.springframework.boot:spring-boot-starter-web' // 新增JPA依赖 implementation 'org.springframework.boot:spring-boot-starter-data-jpa:2.5.3' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' } test { useJUnitPlatform() }
修改后重新构建即可正常运行。
内容的提问来源于stack exchange,提问作者Dongkyun
相关产品推荐
相关产品推荐

