
本文介绍通过构建可复用的 maven/gradle 共享库(如 domain 模块)来解耦和复用 spring boot 多项目中的模型、dto、异常及通用服务逻辑,兼顾开发效率与版本可控性。
本文介绍通过构建可复用的 maven/gradle 共享库(如 domain 模块)来解耦和复用 spring boot 多项目中的模型、dto、异常及通用服务逻辑,兼顾开发效率与版本可控性。
在微服务或多 API 架构中,多个 Spring Boot 应用共享核心领域模型(如 User, Order)、数据传输对象(DTO)、统一异常处理(如 ApiException, GlobalExceptionHandler)或工具类时,直接复制粘贴不仅违背 DRY 原则,更会导致维护成本飙升、版本不一致与 Bug 修复不同步等问题。此时,将公共代码抽取为独立的、可版本化管理的共享库(Shared Library)是最成熟、最推荐的工程实践。
✅ 推荐方案:构建 Maven/Gradle 共享模块
以 Maven 为例,可创建一个独立模块(如 spring-boot-commons),仅包含编译时依赖(如 spring-boot-starter、lombok、jakarta.validation),不引入 Web 或启动类:
<!-- spring-boot-commons/pom.xml -->
<groupId>com.example</groupId>
<artifactId>spring-boot-commons</artifactId>
<version>1.2.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<scope>provided</scope> <!-- 运行时由主应用提供 -->
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>该模块内可安全定义:
-
@Data @NoArgsConstructor的实体类(JPA Entity 或纯 DTO) - 自定义异常类(
BusinessException extends RuntimeException) - 通用响应封装(
Result<t></t>) - 静态工具类(
DateUtils,JsonMapper)
发布后,在其他 Spring Boot 项目中声明依赖即可复用:
<!-- client-specific-api/pom.xml -->
<dependency>
<groupId>com.example</groupId>
<artifactId>spring-boot-commons</artifactId>
<version>1.2.0</version>
</dependency>⚙️ 开发期高效协作:快照版本 + 本地安装
针对你关心的“修改库后是否需频繁编译”问题:开发阶段无需等待远程仓库同步。推荐以下工作流:
- 使用
-SNAPSHOT版本(如1.3.0-SNAPSHOT),配合 Nexus/Artifactory 私服实现自动更新; -
本地快速验证:执行
mvn clean install将当前库安装到本地 Maven 仓库(~/.m2/repository),其他项目mvn compile即可立即使用最新变更; - IDE(IntelliJ IDEA / Eclipse)支持“Reload project”,实时感知库源码变更,甚至可直接调试库内代码。
✅ 提示:启用 Maven 的
--also-make参数可在主项目编译时自动构建依赖的 SNAPSHOT 模块,进一步简化联调流程。
? 关键注意事项
-
避免循环依赖:共享库必须是 无 Spring Boot 启动逻辑 的纯 Java 模块,不可依赖
spring-boot-starter-web等运行时组件; -
语义化版本控制(SemVer):主版本(
MAJOR)升级表示不兼容变更,务必通知所有下游项目;小版本(MINOR)添加向后兼容功能;修订版(PATCH)仅修复 Bug; - API 边界清晰:库中只暴露稳定、通用的接口与类型;敏感业务逻辑、客户端定制化实现仍应保留在各自应用内;
-
测试隔离:为共享库编写单元测试(JUnit 5 + Mockito),但不包含集成测试(如
@SpringBootTest)——它不属于 Spring Boot 上下文的一部分。
综上,构建共享库不是权宜之计,而是面向演进式架构的必要设计。它让主 API 保持专注、客户专属 API 快速交付、团队协作边界清晰,同时通过标准化发布流程保障质量与一致性。


















