Spring Boot多模块项目中跨模块引用类且隔离依赖的方法
解决方案
核心思路是把两个模块共享的代码(比如Entity类)抽成独立的纯基础库模块,让A、B模块各自依赖这个基础模块,从而实现依赖隔离。
步骤1:新建Common基础模块
- 创建一个无启动类的普通Java模块(命名比如
module-Common),不要包含xxxApplication.java - 将A、B模块中需要互相引用的共享代码(Entity、DTO、通用工具类等)迁移到该模块
- 配置该模块的
build.gradle,只保留必要的基础依赖(比如如果Entity用了JPA注解,就加spring-boot-starter-data-jpa),完全不添加业务或安全类依赖
示例Common模块的build.gradle关键配置:
plugins { id 'java' id 'io.spring.dependency-management' version '1.1.4' } group 'com.example' version '1.0-SNAPSHOT' dependencyManagement { imports { mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES } } dependencies { // 仅添加共享代码需要的基础依赖,比如JPA支持 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // 测试依赖按需添加 testImplementation 'org.springframework.boot:spring-boot-starter-test' }
步骤2:调整A、B模块的依赖配置
- 移除A模块中原来的
implementation project(':module-B'),替换为:implementation project(':module-Common') - 在B模块的
build.gradle中添加对Common模块的依赖:implementation project(':module-Common') - B模块的安全组件依赖(比如
spring-boot-starter-security)保留在自身的build.gradle中,不会被A模块引入
步骤3:验证依赖隔离
- 执行Gradle命令查看A模块的依赖树,确认无B模块的专属依赖:
./gradlew module-A:dependencies - 查看B模块的依赖树,确认安全组件依赖存在且Common模块依赖正常:
./gradlew module-B:dependencies
关键说明
原来使用implementation project(':module-B')会导致依赖传递,是因为Gradle的implementation配置会将目标模块的所有依赖一并引入。而抽离Common模块后,该模块仅包含共享代码和必要基础依赖,A、B模块各自依赖Common,彼此的业务依赖完全隔离,不会互相污染。
内容的提问来源于stack exchange,提问作者user14012812
相关产品推荐
相关产品推荐

