# 1 分模块开发与设计 场景:公司有两个项目都需要用户管理功能: ## 方式一:单体项目(包管理) !\[image-20250917023725074\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917023725.png) 以上开发带来的问题: 1 用户管理功能需要在两个项目中重复开发 2 如果用户功能需要修改,两个项目都要改 3 无法共享代码,只能复制粘贴 ## 方式二:maven多模块开发 !\[image-20250917023911151\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917023911.png) 优势: 1 user-module 可以被 project-a 和 project-b 同时引用 2 用户功能只需要维护一份代码 3 修改用户功能时,两个项目都能受益 模块开发最大的好处:以后其他所有的项目只要能用到该模块,都可以直接引入依赖即可使用,不用重复开发 ## 总结: 包管理就像是把所有东西放在一个大房间里用隔断分开,而模块化是把不同的功能放在不同的房间里,可以独立管理、复用和维护。当项目变大或者需要复用时,模块化的优势就会体现出来。 ## 拆分原则: \~\~\~ 一般情况按照功能模块、共用模块拆分 \~\~\~ !\[image-20250917090501061\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917090501.png) 创建模块:File → New → Module # 2 继承 1 继承为两个工程(模块)之间的关系,与java类似,子工程可以继承父工程的配置信息,主要是依赖的继承 2 作用:简化依赖配置,统一管理依赖 3 三种打包方式: !\[image-20250917121156786\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917121156.png) ## 2.1 新建父工程 father-project 父工程:使用 New Project 创建 file-new-project !\[image-20260419224711444\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20260419224711.png) 父工程一般不会用来写业务代码,而是用来做统一管理,因此可以删除src目录,只保留pom.xml即可 \~\~\~xml 4.0.0 org.wyc father-project 1.0-SNAPSHOT pom 17 17 \~\~\~ ## 2.2 新建子工程 son1-project 子模块:使用 New Module 创建 选中父工程-右键-new-module !\[image-20260419224934351\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20260419224934.png) pom.xml: \~\~\~xml 4.0.0 book-parent org.code5 1.0-SNAPSHOT book-son1 \~\~\~ ## 2.3 子工程可以继承父工程的依赖 父pom.xml \~\~\~ junit junit 4.13 test \~\~\~ 查看子工程maven插件 !\[image-20250917143530773\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917143530.png) ## 2.4 子工程也可以覆盖父工程的依赖 父pom.xml \~\~\~ junit junit 4.13 test \~\~\~ 子pom.xml \~\~\~ junit junit 4.11 test \~\~\~ 查看maven插件 !\[image-20250917143922331\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917143922.png) # 3 继承-版本管理 ## 3.1 版本管理 上述讲的是父工程自己写依赖,将来子工程继承了父工程后会自动继承父工程的依赖 弊端:父工程下有N个子工程,每个子工程的依赖是不同的(根据业务来),可能就会出现子工程会继承父工程的依赖,但这些依赖对于子工程而言,是没用的的情况 改良:通过dependencyManagement来管理: 具体:父工程的dependencyManagement只负责统一管理版本,并不会真的引入依赖,子工程需要自己写dependency来获取依赖,只是不用写version了(version被父工程统一管理) 父pom.xml:通过dependencyManagement管理版本,自己本身不会有依赖 \~\~\~ junit junit 4.11 test \~\~\~ 子pom.xml: 不用写版本 \~\~\~ junit junit test \~\~\~ 查看maven插件: !\[image-20250917145039551\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917145039.png) ## 3.2 版本集中管理 可以把版本号集中写在properties中,标签为自定义,比如 \~\~\~ 4.13 \~\~\~ 然后再引入坐标时的version中通过${}获取 父pom.xml !\[image-20250917145452718\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917145452.png) # 4 聚合 将多个模块聚合成一个整体,同时进行项目构建 作用:快速构建项目 ## 4.1举例说明非聚合项目时的弊端 假设一共创建了3个工程: 父:book-parent 子1: book-son1 子2: book-son2 现依赖如下: 父 pom.xml: \~\~\~xml 17 17 4.13 1.2.62 junit junit ${junit-version} test com.alibaba fastjson ${fastjson-version} \~\~\~ 子1:依赖 fastjson \~\~\~ junit junit test com.alibaba fastjson \~\~\~ 子2:依赖 子1 \~\~\~ junit junit test org.code5 book-son1 1.0-SNAPSHOT \~\~\~ 如果要把以上三个项目都install到本地仓库,则必须安装顺序来: 1 book-parent 2 book-son1 3 book-son2 错误做法: 1 book-parent 2 book-son2 3 book-son1 在安装book-son2时会报错 注意:右上角的maven的clean只会清理target目录,如果是已经安装到本地仓库的依赖只能找到目录右键删除 结论:以上项目虽然有父子关系,但是安装时还是只能一个一个安装,并且需要关注依赖关系,安装是要注意顺序,如果模块变多,依赖关系变复杂,则增加我们安装的难度 ## 4.2 使用聚合解决上述问题 当上述项目只是父子关系是,可以查看右上角maven的结构,为平级关系 !\[image-20250917155304325\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917155304.png) 升级为聚合工程: 在父项目book-parent的pom.xml添加如下配置即可 \~\~\~ book-son1 book-son2 \~\~\~ 再次查看maven的结构,为嵌套关系 !\[image-20250917155405016\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917155405.png) 此时,两个子模块才真正属于book-parent项目的一部分,我们只需要在book-parent中install即可 聚合工程中所包含的模块,在构件时,会自动根据模块之间的依赖关系设置构建顺序。 ## 4.3部署: 如果son1和son2相互独立,则应该分别部署 如果son2依赖son1(son1被当作一个工具模块),则只需要部署son2即可,但是son2的pom.xml关于打包的配置不能是如下配置: 因为最终打包不包含依赖的 JAR 包,只包含自己的代码。 \`\`\`java org.apache.maven.plugins maven-jar-plugin com.woniu.Demo1 \`\`\` 需要使用 maven-shade-plugin 打包成"胖 JAR"(包含所有依赖) \`\`\`java org.apache.maven.plugins maven-shade-plugin 3.5.1 package shade com.woniu.Demo1 \`\`\` # 5 私服(可选) !\[image-20250917201320077\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917201320.png) !\[image-20250917201504126\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917201504.png) ## 私服Nexus: 下载地址 \~\~\~ https://help.sonatype.com/repomanager3/download \~\~\~ ## 5.1 从私服下载 在maven的settings.xml中: 1 设置私服访问用户名/密码 (servers标签中配置) !\[image-20250917202014594\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917202014.png) 2 设置私服地址 mirrors标签中配置 !\[image-20250917202126176\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917202126.png) 注意: 1 server 标签内的 \*\*id\*\* 标签值必须和 mirror 标签中的 \*\*id\*\* 值一样 2 删除中央仓库的阿里云镜像地址 (私服镜像和阿里云镜像不能共存) !\[image-20250917202308658\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917202308.png) 以上配置完后就可以从私服下载依赖了 ## 5.2 上传到私服 1 profiles标签中配置 !\[image-20250917202232221\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917202232.png) idea中父工程的pom.xml中; 2 在project标签中配置 !\[image-20250917202436955\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917202437.png) 注意:pom.xml和settings.xml中保证id一致 !\[image-20250917202503289\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917202503.png) ## 3 父工程中点击maven的lifecycle的deploy发布 !\[image-20250917202603990\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20250917202604.png) # 6 其他 ## 6.1 pluginManagement 父工程可以通过pluginManagement配置maven插件,子工程可直接继承使用,无需再配置(不同于dependencyManagement,子工程也需要写dependency才行) \`\`\`java org.apache.maven.plugins maven-jar-plugin 3.3.0 \`\`\` ## 6.2 relativePath标签 子模块需要在parent标签中关联父模块的pom.xml 先从本地查找父模块,如果找不到会尝试从远处仓库中查找 默认为 \~\~\~ ../pom.xml \~\~\~ !\[image-20260420215226907\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20260420215226.png) !\[image-20260420215415989\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/web/wangyongcheng/20260420215416.png)