如何让3个独立Spring Boot项目共享公共依赖以减小WAR包体积?
Spring Boot多项目公共依赖瘦身方案
方案1:纯依赖管理模块(不生成JAR包)
新建一个仅做依赖版本管控的项目(比如命名为common-dependencies),无需编写业务代码,仅通过构建工具统一管理公共依赖的版本和坐标:
- Maven配置示例:将项目打包类型设为
pom,通过<dependencyManagement>块集中声明所有公共依赖的版本,子项目只需引用该模块,无需重复写版本号,且不会将公共依赖打包进自身WAR包。
<!-- common-dependencies的pom.xml --> <groupId>com.yourcompany</groupId> <artifactId>common-dependencies</artifactId> <version>1.0.0</version> <packaging>pom</packaging> <!-- 核心:仅生成pom文件,不产出JAR --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.7.15</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.5</version> </dependency> <!-- 其他公共依赖按需添加 --> </dependencies> </dependencyManagement>
- 子项目引用方式:在子项目的
pom.xml中把该模块设为父项目,直接声明需要的依赖即可,无需指定版本:
<!-- 子项目pom.xml --> <parent> <groupId>com.yourcompany</groupId> <artifactId>common-dependencies</artifactId> <version>1.0.0</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
方案2:容器级依赖共享(彻底剥离公共依赖)
如果要完全让子项目WAR包不包含公共依赖,可结合应用服务器的共享库机制:
- 将所有公共依赖的JAR包放到应用服务器的全局
lib目录(比如Tomcat的CATALINA_HOME/lib)。 - 在子项目中把公共依赖的
scope设为provided,构建工具会自动排除这些依赖,WAR包仅保留业务代码和项目专属依赖。 - 配合方案1的依赖管理模块,确保服务器上的JAR版本与子项目声明一致,避免版本冲突。
方案3:Spring Boot Thin Launcher特性
利用Spring Boot的thin launcher插件,让子项目打包时仅包含自身业务代码和引导文件,公共依赖在运行时从指定目录(本地或私有仓库)加载:
- 插件会自动识别依赖管理模块中声明的版本,运行时共享同一份公共依赖文件,彻底避免WAR包冗余。
注意事项
- 依赖管理模块需发布到公司私有仓库(如Nexus),确保团队成员可正常拉取。
- 容器共享依赖时,所有子项目必须使用统一版本的公共依赖,防止类加载冲突。
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

