项目用的是Ma ven多模块架构,但稍微一翻代码就发现问题了——好几个子模块的pom.xml里,都在重复引用同样的JAR包。
说起来,这个问题其实挺常见的。当初配置模块的时候,要么没想清楚每个模块到底该干什么,要么就是对Ma ven模块依赖的传递性没吃透。结果呢?依赖冗余、版本冲突、构建效率下降,一个接一个冒出来。
所以这篇内容,重点梳理一下Ma ven多模块的配置思路和实操流程。
在动手配之前,先大致了解整体框架——配置过程其实就三大步:先确定项目需要哪些模块,再理清模块之间的依赖关系,最后按依赖关系配好pom文件就行。
第一步:确定项目的模块划分
模块怎么分?其实没有任何强制要求,更多是看项目本身的情况。下面是一般项目的常见划分思路:
test集成测试模块:只放测试用例,不包含任何业务逻辑。facade对外服务接口模块(业务类项目一般较小,服务类项目比较常见):定义对外提供的接口、请求参数、返回结果等,作为一个独立的JAR包供其他项目依赖。client集成外部服务接口模块:功能跟facade对应,专门处理外部服务的依赖。lang基础公用模块:所有模块都会用的公共类,比如工具类、通用枚举等。das数据访问模块:封装DB层的代码,包括DO/DAO等。service领域核心服务模块:核心业务逻辑集中在这里。web/biz业务模块:处理具体的业务请求。如果业务比较复杂,还可以进一步拆分,比如web-user、web-order等。
按照这个思路,举个例子,模块划分可以这样:
ntopic-test集成测试模块ntopic业务逻辑模块,包含SpringBoot启动类、Web模块、业务逻辑等ntopic-servcie领域核心服务ntopic-client外部服务集成ntopic-dasDB操作ntopic-lang公共模块
第二步:确定各个模块的依赖关系
Ma ven模块的依赖有个很重要的特性——传递性。举个例子:如果模块A依赖模块B,模块B又依赖模块C,那么模块A会自动依赖模块C。这就像数学里数值大小的传递性,A>B且B>C,那A>C肯定成立。
结合这个特性,再看一下各个模块之间的依赖关系:
ntopic-test集成测试模块:它包含了所有代码逻辑,所以处于最上层。ntopic业务模块:业务逻辑需要依赖service模块提供核心服务。ntopic-service核心服务模块:它依赖DB数据读写,还要引入外部服务。ntopic-lang公共逻辑模块:进一步依赖其他统一模块,比如commons模块等。
第三步:Ma ven多模块实操
多模块配置的核心在pom.xml文件里。每个pom.xml模块,都至少需要配置五个核心元素:
groupId:大分组,一般用公司域名,比如com.aliaba。artifactId:具体的JAR包名,比如sequence-jdbc / fastjson。version:JAR包版本,比如1.0.1 / 1.2.76。packaging:模块打包方式,默认是jar,多模块的总模块或父模块用pom。name:模块名称,这个可选,但建议配上,方便识别。
总pom.xml文件
总pom.xml负责配置整个项目的所有信息,包括模块列表、依赖的JAR包、仓库地址和打包方式等。
父模块是可选的,不一定非要有。比如ntopic-boot基于SpringBoot框架,所以它的父模块直接用了SpringBoot的。
4.0.0 org.springframework.boot spring-boot-starter-parent 2.5.3 ntopic ntopic-parent 1.0.1 pom ntopic-parent
接下来指定本项目包含的模块列表:
ntopic-test ntopic ntopic-service ntopic-das ntopic-client ntopic-lang
依赖管理部分也很关键。在dependencyManagement里统一声明依赖,各个子模块直接用就行了,不必重复写版本号。
ntopic ntopic-lang ${ntopic.version} ntopic ntopic-client ${ntopic.version} org.springframework.boot spring-boot-starter-jdbc ${springboot.boot.version} com.google.gua va gua va 30.1.1-jre
此外,还需要配置额外的Ma ven仓库和打包方式:
Gitee-obullxl https://gitee.com/obullxl/ma ven-repository/raw/sequence-jdbc org.springframework.boot spring-boot-ma ven-plugin ${springboot.boot.version}
子模块pom.xml文件
总模块配好之后,子模块的配置就简单多了。只需要配置三个信息块:父模块、四元素(artifactId、packaging、version、name)和依赖的其他子模块。依赖关系就按照第二步的梳理来配。
4.0.0 ntopic ntopic-parent 1.0.1 ntopic-service jar ${ntopic.version} ntopic-service ntopic ntopic-das ntopic ntopic-client
编译项目各个模块
配置完成之后,直接执行编译命令就可以了:
mvn compile
编译成功的话,会看到类似这样的输出:
[INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] ntopic-parent ...................................... SUCCESS [ 0.022 s] [INFO] ntopic-lang ........................................ SUCCESS [ 0.873 s] [INFO] ntopic-das ......................................... SUCCESS [ 0.121 s] [INFO] ntopic-client ...................................... SUCCESS [ 0.042 s] [INFO] ntopic-service ..................................... SUCCESS [ 0.055 s] [INFO] ntopic ............................................. SUCCESS [ 0.073 s] [INFO] ntopic-test ........................................ SUCCESS [ 0.114 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.094 s [INFO] Finished at: 2023-12-15T19:44:56+09:00 [INFO] Final Memory: 35M/448M [INFO] ------------------------------------------------------------------------
总结
以上就是Ma ven多模块架构的完整配置流程,从模块划分、依赖关系到实际配置,环环相扣。核心就是吃透依赖传递性,合理规划模块职责,避免重复引用和版本混乱。希望能提供一个清晰的参考。
