当前位置: 首页 > article >正文

Maven父子工程搭建:微服务项目模块化架构基础

Maven父子工程搭建微服务项目模块化架构基础一、为什么需要Maven父子工程在单体应用向微服务架构演进的过程中项目规模会迅速膨胀。想象一个电商系统包含用户中心、商品服务、订单服务、支付服务、库存服务等数十个模块——如果每个服务都是一个独立的Git仓库依赖管理将是一场噩梦版本冲突各服务Spring Boot版本不一致导致API不兼容重复配置每个pom.xml都要重复声明Lombok、Jackson等基础依赖构建混乱缺乏统一入口CI/CD流水线难以编排代码冗余DTO、工具类在多个服务间复制粘贴Maven父子工程Multi-Module Project正是解决这些痛点的标准方案。它通过继承聚合机制实现依赖版本统一、构建流程标准化、公共代码复用是微服务架构的基石。二、核心概念继承 vs 聚合在动手之前先理清两个关键概念特性继承Inheritance聚合Aggregation目的复用父POM的配置统一构建多个模块语法parent标签modules标签关系子POM继承父POM属性父POM知道子模块存在打包方式子模块可以是jar/war父模块必须是pom视觉表现子模块可分布在任意位置子模块通常在父目录下关键认知一个父工程可以同时是被继承的父POM和聚合构建的入口这是微服务项目的标准模式。三、实战从零搭建微服务父子工程我们将构建一个名为microservice-platform的多模块项目包含以下模块microservice-platform/ ├── pom.xml # 父POM仅聚合无代码 ├── common-api/ # 公共API模块DTO、常量 ├── common-util/ # 工具类模块 ├── service-user/ # 用户服务可独立部署 ├── service-order/ # 订单服务可独立部署 └── gateway-service/ # 网关服务步骤1创建父工程Project Parent父工程是空壳只保留pom.xml必须删除src目录?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/modelVersion!-- 项目坐标 --groupIdcom.example/groupIdartifactIdmicroservice-platform/artifactIdversion1.0.0-SNAPSHOT/version!-- 关键打包方式必须是pom --packagingpom/packaging!-- 聚合声明构建时按顺序处理这些模块 --modulesmodulecommon-api/modulemodulecommon-util/modulemoduleservice-user/modulemoduleservice-order/modulemodulegateway-service/module/modules!-- 全局属性所有子模块可引用 --propertiesjava.version17/java.versionproject.build.sourceEncodingUTF-8/project.build.sourceEncoding!-- 版本统一管理子模块引用时无需写版本号 --spring-boot.version3.2.0/spring-boot.versionspring-cloud.version2023.0.0/spring-cloud.versionspring-cloud-alibaba.version2022.0.0.0/spring-cloud-alibaba.versionlombok.version1.18.30/lombok.version/properties!-- 依赖管理声明但不引入子模块按需继承 --dependencyManagementdependencies!-- Spring Boot BOM --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring-boot.version}/versiontypepom/typescopeimport/scope/dependency!-- Spring Cloud BOM --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependency!-- 内部模块版本管理 --dependencygroupIdcom.example/groupIdartifactIdcommon-api/artifactIdversion${project.version}/version/dependencydependencygroupIdcom.example/groupIdartifactIdcommon-util/artifactIdversion${project.version}/version/dependency/dependencies/dependencyManagement!-- 插件管理 --buildpluginManagementpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion${spring-boot.version}/version/plugin/plugins/pluginManagement/build/project关键点解析packagingpom/packaging父工程不产出jar/war只作为配置中心scopeimport/scope这是BOMBill of Materials导入语法将Spring Boot/Cloud的依赖管理合并到当前POMdependencyManagementvsdependencies前者声明版本不引入依赖后者实际引入。父工程通常只用前者避免强制所有子模块接受相同依赖步骤2创建公共模块Library Modules公共模块是纯Java库供业务服务依赖不可独立运行。common-api 模块DTO与接口定义?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/modelVersion!-- 继承父POM --parentgroupIdcom.example/groupIdartifactIdmicroservice-platform/artifactIdversion1.0.0-SNAPSHOT/version/parentartifactIdcommon-api/artifactId!-- 打包为jar库 --packagingjar/packagingdependencies!-- 无需版本号继承父POM的dependencyManagement --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdscopeprovided/scope/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/dependency/dependencies/project模块内定义统一响应体packagecom.example.common.api;importlombok.Data;importjava.time.LocalDateTime;DatapublicclassResultT{privateIntegercode;privateStringmessage;privateTdata;privateLocalDateTimetimestamp;publicstaticTResultTsuccess(Tdata){ResultTresultnewResult();result.setCode(200);result.setMessage(success);result.setData(data);result.setTimestamp(LocalDateTime.now());returnresult;}publicstaticTResultTerror(Stringmessage){ResultTresultnewResult();result.setCode(500);result.setMessage(message);result.setTimestamp(LocalDateTime.now());returnresult;}}common-util 模块工具类projectparentgroupIdcom.example/groupIdartifactIdmicroservice-platform/artifactIdversion1.0.0-SNAPSHOT/version/parentartifactIdcommon-util/artifactIdpackagingjar/packagingdependenciesdependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactId/dependency/dependencies/project步骤3创建业务服务模块Deployable Services业务服务是可独立部署的Spring Boot应用需要打包为可执行jar。service-user 模块用户服务?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/modelVersionparentgroupIdcom.example/groupIdartifactIdmicroservice-platform/artifactIdversion1.0.0-SNAPSHOT/version/parentartifactIdservice-user/artifactIdpackagingjar/packagingdependencies!-- 引入内部公共模块 --dependencygroupIdcom.example/groupIdartifactIdcommon-api/artifactId/dependencydependencygroupIdcom.example/groupIdartifactIdcommon-util/artifactId/dependency!-- Spring Boot Web版本由父POM管理 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- Nacos服务发现 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency/dependenciesbuildplugins!-- 打包可执行jar --plugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project启动类packagecom.example.user;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplicationEnableDiscoveryClientpublicclassUserServiceApplication{publicstaticvoidmain(String[]args){SpringApplication.run(UserServiceApplication.class,args);}}四、关键技巧与避坑指南1. 循环依赖的破解之道问题场景订单服务需要用户信息用户服务需要订单统计直接依赖会导致循环。解决方案依赖倒置定义user-api和order-api接口模块服务实现这些接口事件驱动使用MQKafka/RabbitMQ异步通信彻底解耦2. 版本管理策略场景推荐做法第三方框架Spring Boot父POMdependencyManagement统一声明内部公共模块父POMdependencyManagement锁定版本业务服务特有依赖子POM直接声明版本如特定数据库驱动3. 构建优化命令# 只构建特定模块及其依赖mvninstall-plservice-user-am# 跳过测试加速构建mvn clean package-DskipTests# 查看依赖树排查冲突mvn dependency:tree-plservice-order4. 常见错误错误1父POM忘记packagingpom/packaging导致构建失败错误2子模块未声明parent版本管理失效错误3公共模块引入spring-boot-starter导致依赖传递污染五、进阶与CI/CD集成父子工程天然适合流水线构建# .github/workflows/build.yml 示例jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv3-name:Build Common Modulesrun:mvn install-pl common-api,common-util-am-name:Parallel Build Servicesstrategy:matrix:service:[service-user,service-order,gateway-service]run:mvn package-pl ${{matrix.service}}-am通过-amalso-make参数Maven会自动构建当前模块依赖的所有上游模块确保版本一致性。六、总结Maven父子工程是微服务架构的基础设施其价值体现在版本一致性通过BOM导入和dependencyManagement杜绝依赖冲突构建标准化统一入口支持并行构建和增量编译代码复用公共模块API、工具类天然共享团队协作新人只需clone一个仓库即可看到全貌下一步演进当模块数量超过20个时可考虑将父工程拆分为platform-bom纯版本管理和platform-parent聚合构建实现更细粒度的控制。参考文档Java项目架构设计模块化、分层架构的实战经验 - 华为云Spring Cloud 从零到一如何基于Maven 构建微服务多模块系统 - 华为云

相关文章:

Maven父子工程搭建:微服务项目模块化架构基础

Maven父子工程搭建:微服务项目模块化架构基础 一、为什么需要Maven父子工程? 在单体应用向微服务架构演进的过程中,项目规模会迅速膨胀。想象一个电商系统,包含用户中心、商品服务、订单服务、支付服务、库存服务等数十个模块—…...

微服务七大核心组件详解:搞懂架构运行底层逻辑

从实战视角拆解微服务架构的"五脏六腑",掌握每个组件的设计哲学与落地细节一、为什么需要这七大组件? 微服务架构的本质是分布式系统的工程化实践。当单体应用拆分为数十个甚至上百个独立服务后,我们面临的核心挑战:挑战…...

2009 Text 1

2009 Text 1...

2007 Text 3

2007 Text 3...

MATLAB频谱分析:从fft到fftshift的实战解读

1. 为什么我们需要频谱分析? 想象一下你正在调试一段音频,听到里面有奇怪的嗡嗡声。作为工程师,你不仅想知道"有杂音",更想知道这个杂音具体是哪个频率成分。这就是频谱分析的用武之地——它像是一把声音的显微镜&#…...

2025届学术党必备的六大AI科研工具推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 减小AIGC印记的关键之处在于模仿人类创作的非直线特性。其一,改变句式架构&#…...

智能对话式开发:通过快马平台AI模型将你的想法直接变为cloud code应用

智能对话式开发:通过快马平台AI模型将你的想法直接变为cloud code应用 最近在尝试用AI辅助开发一个天气查询小工具,整个过程让我深刻体会到cloud code与AI结合的强大之处。传统开发需要自己写代码、调试、部署,而现在只需要用自然语言描述需…...

2026最权威的十大降AI率平台实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 此刻,AI生成那种内容的检测变得越发严格起来,降AI工具就顺势产生了&a…...

实战指南:基于快马平台生成企业级cc switch管理系统,助力游戏项目开发

今天想和大家分享一个在游戏开发中特别实用的技术——CC Switch系统。这个系统在商业游戏项目中经常被用来做调试和功能开关控制,最近我在InsCode(快马)平台上快速实现了一个完整的企业级解决方案,整个过程特别顺畅。 先说说什么是CC Switch。简单理解就…...

ngx_sort

1 定义 ngx_sort 函数 定义在 ./nginx-1.24.0/src/core/ngx_string.cvoid ngx_sort(void *base, size_t n, size_t size,ngx_int_t (*cmp)(const void *, const void *)) {u_char *p1, *p2, *p;p ngx_alloc(size, ngx_cycle->log);if (p NULL) {return;}for (p1 (u_char…...

火电行业低成本私有化 RAG 部署

全球 AI 算力市场正处于一场看不见的“围城”之中。 当苹果被曝出为了备战 iOS 18 的 AI 功能,疯狂扫货数千台 NVLX H100 GPU 集群,导致全球高端算力卡供货周期延长至 52 周以上时,对于传统重资产运营的行业——如火电企业——而言&#xff…...

通过“运行规程”智能体,让 RAG 秒变监盘专家!

在当今全球能源结构转型的宏大叙事下,火力发电厂正面临着前所未有的双重夹击:一边是波动性极大的新能源并网带来的调峰压力,另一边是极度严苛的碳排放法规。在集控室(Control Room)里,运行人员(…...

高速移动场景下无线信道的延迟-多普勒域建模与优化

1. 高速移动场景下的无线信道挑战 想象一下你正坐在时速120公里的高铁上刷视频,突然画面开始卡顿——这就是典型的高速移动场景通信问题。当收发端相对速度超过100km/h时,传统无线信道模型就会像老式收音机遇到隧道一样"失灵"。我在参与某车企…...

从 0 到 1 构建你的第一个 AI Agent 项目——完整实战指南

【AI 开发】从 0 到 1 构建你的第一个 AI Agent 项目(2026 最新实战指南) 摘要 想做一个能写进简历的 AI Agent 项目,但不知道从哪开始?本文从项目选择、架构设计、技术选型到落地表达,给你一套完整的方法论。避开&q…...

【C++第二十四章】异常

前言 🚀C 的异常机制,本质上是在回答一个非常现实的问题:当函数已经无法在当前位置继续处理错误时,应该怎样把错误交给更高层、更合适的位置处理。 如果只依赖返回值层层上报,那么调用链一长,代码就会迅速充…...

x86汇编堆栈第二个案例

x86汇编堆栈第二个案例x86汇编堆栈第二个案例 1)案例介绍 咱们上节课先把常见的x86下的堆栈过了一遍,包括基本指令对吧,除了上一个案例咱们还可以做什么使用现在学到的内容?既然咱们知道了“后进先出(LIFO)…...

x86汇编堆栈

x86汇编堆栈 1)堆栈操作 x86汇编中的堆栈是一块特殊的内存区域,用于存储程序运行时的数据。它遵循"后进先出LIFO的原则",主要用于函数调用时的参数传递、局部变量存储以及保存返回地址。 堆栈操作的核心指令是PUSH和POP。PUSH指令将…...

别再自己造轮子了!用InsightFace+FastAPI快速搭建一个高精度人脸识别Web服务

基于InsightFace的高精度人脸识别Web服务实战指南 1. 为什么选择InsightFace构建人脸识别服务 三年前我接手一个考勤系统项目时,曾花费两个月时间从零训练FaceNet模型,结果上线后遇到戴眼镜员工识别率骤降的问题。直到发现InsightFace这个开源项目&#…...

x86汇编如何使用伪指令实现if,else,while,dowhile,switch-case

x86汇编如何使用伪指令实现if,else,while,dowhile,switch-case 1)汇编伪指令介绍 伪指令是汇编器提供的语法规则,它主要为程序员提供语法糖简化汇编代码的编写。常见的伪指令包括条件汇编类(IF&…...

AI率从90%降到合格线,我踩了3个坑后找到的方法

我的论文AI率在知网检出了91%。 最后我把AI率降到了9%,但在这之前踩了3个坑,多花了将近两天时间。这篇文章不是炫成绩,是把这3个坑说清楚,让后来的人少走一段弯路。 坑一:花了一天手动改写,基本没用 拿到…...

AI率85%的论文,这款工具降完后我直接去答辩了

答辩前5天,知网AIGC检测报告出来了:AI率85%。 我是那种遇到问题喜欢先搜索再行动的人,所以花了两个小时看了很多经验帖。最终决策:不手改,直接上比话降AI。 结果:11%,答辩前3天处理完&#xf…...

AI率85%降到15%的完整操作流程,一步一步来

AI率85%,这不是个小问题,但也不是无解的问题。我把整个处理流程拆成了具体步骤,照着来就行,没什么复杂的。 在开始之前,明确一件事 AI率85%的论文,靠手动修改降到15%,从理论上讲是可行的&…...

AI率80%+送去降AI工具处理,3款结果对比

这篇文章记录的是一个横向测试:找了几篇AI率都在80%以上的论文,分别送去嘎嘎降AI、比话降AI、率零处理,然后统一在知网检测,看最终结果。 测试设计 测试论文(4篇): 编号专业字数知网AI率&…...

2026届毕业生推荐的AI学术工具实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于毕业论文写作进程里,人工智能工具可充作辅助方式用以提高效率。学生能借AI开展…...

OpenCV直线检测避坑指南:HoughLinesP参数调优实战(Python版)

OpenCV直线检测避坑指南:HoughLinesP参数调优实战(Python版) 在计算机视觉项目中,直线检测往往是基础却关键的一环。无论是自动驾驶中的车道线识别,还是工业质检中的零件尺寸测量,亦或是文档扫描应用中的表…...

YimMenu终极指南:5分钟学会GTA5最强安全增强工具

YimMenu终极指南:5分钟学会GTA5最强安全增强工具 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...

Steam Depot清单自动化工具:Onekey实现游戏数据高效管理的完整方案

Steam Depot清单自动化工具:Onekey实现游戏数据高效管理的完整方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 在游戏开发与玩家社区中,获取和管理Steam游戏清单一直…...

3大终极方案解决Amlogic设备U盘启动难题:从故障诊断到系统优化的完整指南

3大终极方案解决Amlogic设备U盘启动难题:从故障诊断到系统优化的完整指南 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s90…...

如何用DS4Windows让PS手柄在PC游戏世界畅通无阻

如何用DS4Windows让PS手柄在PC游戏世界畅通无阻 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否曾遇到这样的尴尬场景:购买了心仪的PS4或PS5手柄,想在PC上畅…...

云效流水线+K8s实战:Java微服务全自动部署与优化指南(手把手版)

1. 云效流水线入门:从零搭建Java微服务CI/CD管道 第一次接触云效流水线时,我像发现新大陆一样兴奋——原来部署可以这么简单!记得去年团队还在用Jenkins手动打包部署,每次发版都要折腾到凌晨。现在用云效 K8s的组合,我…...