
本文介绍一种不增加 war 包体积、又避免重复打包公共依赖的实践方案:将通用组件抽离为独立模块,通过 maven 多模块结构与本地/私有仓库协同管理,实现真正可复用、可维护、零冗余的依赖共享。
本文介绍一种不增加 war 包体积、又避免重复打包公共依赖的实践方案:将通用组件抽离为独立模块,通过 maven 多模块结构与本地/私有仓库协同管理,实现真正可复用、可维护、零冗余的依赖共享。
在微服务或模块化开发中,多个 Spring Boot 项目(如 user-service、order-service、payment-service)常共享大量基础依赖(如 Spring Security 配置、统一异常处理、通用工具类、自定义 Starter 等)。若每个项目各自声明并打包这些依赖,不仅导致 WAR 文件体积显著膨胀,还带来版本不一致、升级困难、重复维护等痛点。
正确解法:构建可复用的 Spring Boot 公共模块(非“system” scope 黑盒方案)
✅ 推荐架构:Maven 多模块 + 私有仓库(如 Nexus/Artifactory)
将公共能力封装为标准的 Spring Boot Starter 或 Auto-Configuration 模块(JAR),而非直接操作 classpath 或使用 system scope——后者已被 Maven 官方标记为“不推荐”,存在不可移植、CI/CD 不兼容、IDE 支持差、无法传递依赖等严重缺陷。
步骤示例:
-
创建公共模块
common-starter<!-- common-starter/pom.xml --> <groupid>com.example</groupid><artifactid>common-starter</artifactid><packaging>jar</packaging><dependencies><dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-web</artifactid><optional>true</optional></dependency><dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-validation</artifactid><optional>true</optional></dependency><!-- 自定义自动配置 --><dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-autoconfigure</artifactid></dependency></dependencies>
-
编写自动配置类(支持条件加载)
@Configuration @ConditionalOnClass(WebMvcConfigurer.class) @EnableConfigurationProperties(CommonProperties.class) public class CommonAutoConfiguration { @Bean @ConditionalOnMissingBean public GlobalExceptionHandler globalExceptionHandler() { return new GlobalExceptionHandler(); } } -
发布至私有仓库
mvn clean deploy -DaltDeploymentRepository=private::default::https://nexus.example.com/repository/maven-releases/
-
各业务项目引入(干净、标准、可传递)
<!-- user-service/pom.xml --> <dependency><groupid>com.example</groupid><artifactid>common-starter</artifactid><version>1.2.0</version></dependency>
⚠️ 关键注意事项:
- ❌ 避免
systemscope:它绕过 Maven 依赖解析机制,破坏构建可重现性,且 Spring Boot Maven Plugin 在打包 WAR 时无法正确识别 system 依赖,极易导致运行时ClassNotFoundException; - ✅ 使用
控制传递性,防止公共模块意外引入冗余依赖;true - ✅ 所有公共模块应遵循 Spring Boot Starter 命名规范(
xxx-spring-boot-starter),并提供spring.factories或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 3.2+); - ✅ 在 CI 流水线中统一管理
common-starter版本,配合语义化版本(SemVer)和依赖锁定(maven-dependency-plugin:copy-dependencies或dependencyManagement),确保多项目环境一致性。
最终效果:各业务 WAR 包仅保留自身特有代码与轻量级 starter 引用,体积下降 30%–60%,同时获得集中治理、灰度升级、统一监控等企业级收益。











