Java外卖霸王餐API项目模块化:基于Maven BOM统一管理多模块依赖版本(避免“依赖地狱”)
Java外卖霸王餐API项目模块化基于Maven BOM统一管理多模块依赖版本避免“依赖地狱”背景外卖霸王餐项目的依赖管理之痛作为外卖霸王餐API唯一供给源头同时也是霸王餐外卖CPS取链源头俱美开放平台的后端系统是一个典型的多模块Maven项目。随着业务不断迭代项目模块日益增多如api-gateway网关、order-service订单、user-service用户、common-utils公共工具等。在传统的依赖管理方式下每个模块的pom.xml都需要独立声明其依赖及其版本。这导致了严重的“依赖地狱”问题版本不一致不同模块可能引入了同一个库如Spring Boot、FastJSON的不同版本引发运行时冲突。升级困难升级一个核心依赖如Spring Cloud需要手动修改十几个甚至几十个模块的pom.xml耗时且容易出错。代码冗余大量重复的dependency和version标签充斥在各个模块中难以维护。Maven BOMBill of Materials是解决这一问题的最佳实践。什么是Maven BOMBOM是一种特殊的POM文件用于集中管理一组相关依赖的版本号。其他模块通过dependencyManagement引入BOM后在声明具体依赖时就无需再指定版本号从而实现依赖版本的统一控制。项目结构设计baodanbao-parent/ ├── pom.xml (父POM打包类型为pom) ├── baodanbao-bom/ │ └── pom.xml (BOM模块打包类型为pom) ├── baodanbao-common/ │ └── pom.xml (公共模块) ├── baodanbao-api/ │ └── pom.xml (API接口模块) ├── baodanbao-order/ │ └── pom.xml (订单服务模块) └── baodanbao-user/ └── pom.xml (用户服务模块)第一步创建BOM模块!-- baodanbao-bom/pom.xml --?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdbaodanbao.com.cn/groupIdartifactIdbaodanbao-parent/artifactIdversion1.0.0-SNAPSHOT/version/parentartifactIdbaodanbao-bom/artifactIdpackagingpom/packagingnamebaodanbao-bom/namedescription外卖霸王餐项目依赖版本管理BOM/descriptiondependencyManagementdependencies!-- Spring Boot BOM --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion2.7.18/versiontypepom/typescopeimport/scope/dependency!-- Spring Cloud BOM --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion2021.0.8/versiontypepom/typescopeimport/scope/dependency!-- 阿里巴巴生态依赖 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion2021.0.5.0/versiontypepom/typescopeimport/scope/dependency!-- 常用工具类 --dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.12.0/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion2.0.43/version/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.26/version/dependency!-- 数据库相关 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3.1/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependency!-- Redis --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdversion2.7.18/version/dependency!-- 测试 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdversion2.7.18/versionscopetest/scope/dependency/dependencies/dependencyManagementbuildplugins!-- 跳过测试打包 --plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-surefire-plugin/artifactIdconfigurationskipTeststrue/skipTests/configuration/plugin/plugins/build/project第二步父POM配置!-- pom.xml --?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdbaodanbao.com.cn/groupIdartifactIdbaodanbao-parent/artifactIdversion1.0.0-SNAPSHOT/versionpackagingpom/packagingnamebaodanbao-parent/namedescription外卖霸王餐API项目父模块/descriptionmodulesmodulebaodanbao-bom/modulemodulebaodanbao-common/modulemodulebaodanbao-api/modulemodulebaodanbao-order/modulemodulebaodanbao-user/module/modulespropertiesjava.version1.8/java.versionmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencyManagementdependencies!-- 引入BOM --dependencygroupIdbaodanbao.com.cn/groupIdartifactIdbaodanbao-bom/artifactIdversion${project.version}/versiontypepom/typescopeimport/scope/dependency!-- 内部模块依赖管理 --dependencygroupIdbaodanbao.com.cn/groupIdartifactIdbaodanbao-common/artifactIdversion${project.version}/version/dependency/dependencies/dependencyManagementbuildpluginManagementpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion2.7.18/version/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.11.0/versionconfigurationsource1.8/sourcetarget1.8/targetencodingUTF-8/encoding/configuration/plugin/plugins/pluginManagement/build/project第三步子模块使用BOM!-- baodanbao-order/pom.xml --?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdbaodanbao.com.cn/groupIdartifactIdbaodanbao-parent/artifactIdversion1.0.0-SNAPSHOT/version/parentartifactIdbaodanbao-order/artifactIddependencies!-- Spring Boot Web - 无需指定版本 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- MyBatis Plus - 无需指定版本 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactId/dependency!-- MySQL Driver - 无需指定版本 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!-- 公共模块 --dependencygroupIdbaodanbao.com.cn/groupIdartifactIdbaodanbao-common/artifactId/dependency!-- Hutool工具类 - 无需指定版本 --dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactId/dependency!-- 测试依赖 - 无需指定版本 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project第四步Java代码示例packagebaodanbao.com.cn.order.controller;importbaodanbao.com.cn.common.response.ApiResponse;importbaodanbao.com.cn.order.entity.Order;importbaodanbao.com.cn.order.service.OrderService;importcn.hutool.core.date.DateUtil;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importjava.util.List;/** * 订单控制器 * author baodanbao.com.cn */RestControllerRequestMapping(/api/order)publicclassOrderController{AutowiredprivateOrderServiceorderService;GetMapping(/list)publicApiResponseListOrdergetOrderList(RequestParamStringuserId){ListOrderordersorderService.getOrdersByUser(userId);returnApiResponse.success(orders);}PostMapping(/create)publicApiResponseStringcreateOrder(RequestBodyOrderorder){order.setCreateTime(DateUtil.now());order.setUpdateTime(DateUtil.now());orderService.save(order);returnApiResponse.success(订单创建成功);}GetMapping(/detail/{orderId})publicApiResponseOrdergetOrderDetail(PathVariableStringorderId){OrderorderorderService.getById(orderId);returnApiResponse.success(order);}}packagebaodanbao.com.cn.common.response;importlombok.Data;/** * 统一API响应 * author baodanbao.com.cn */DatapublicclassApiResponseT{privateintcode;privateStringmessage;privateTdata;publicstaticTApiResponseTsuccess(Tdata){ApiResponseTresponsenewApiResponse();response.setCode(200);response.setMessage(success);response.setData(data);returnresponse;}publicstaticTApiResponseTerror(intcode,Stringmessage){ApiResponseTresponsenewApiResponse();response.setCode(code);response.setMessage(message);returnresponse;}}效果对比方案维护成本版本一致性升级难度传统方式高差困难BOM方式低好简单通过Maven BOM俱美开放平台实现了依赖版本的集中管理彻底解决了依赖地狱问题。本文著作权归 俱美开放平台 转载请注明出处