关于Maven的多模块管理
Maven很强大,可以让我们在开发的过程中更加方便地去管理依赖。一般来说,如果是简单的个人项目的话,那项目分不分功能模块,就不显得那么重要。但是,如果项目有未来的发展甚至有更改架构或者多人协同开发的需求的话,那将项目各个功能拆分为多个功能模块就很有必要了。
将单模块项目拆分为多模块后有什么好处?
单模块项目的的话,随着项目的发展和代码量的叠加,各个功能代码之间会不可避免地耦合在一起,这就与高内聚,低耦合背道而行了。将项目进行多模块拆分有以下好处:
- 降低耦合性:将项目拆分为各个模块,各个模块负责实现各自的功能,系统一旦出了问题,定位起来也比较方便。
- 使项目结构更加清晰:将项目按照职责或者功能进行拆分,使开发者更容易分析了解项目。
- 规范边界:不同的开发者可以根据不同的模块确定自己所负责的代码内容。
- …
如何按照职责或者功能进行拆分?
按照职责拆分
所谓按照职责拆分,就是按照web系统各层的结构去拆分。
- tclass-entity
- tclass-mapper
- tclass-service
- tclass-controller
- tclass-common
- tclass-util
按照功能拆分
按照功能拆分,将系统中各个功能拆分为各个独立的模块,不仅开发者分工清晰,还可以方便系统设计为微服务架构。
- tclass-login 登录
- tclass-notice 通知
- tclass-work 作业
- tclass-file 文件
- tclass-user 用户
搭建多模块项目
创建父模块
首先,创建一个基本的Maven项目。因为作为父模块,依赖什么的都可以不用选。
我们看一下父模块中的pom.xml文件。
因为我们要将项目拆分为多个子模块,父模块中的内容就是各个子模块,所以我们将父模块中的src文件夹删除。
创建子模块
创建子模块和创建普通的项目一样,可以理解为在父项目中创建子项目。每一个子模块都有自己完整的项目目录结构,我们可以为子模块选择所需的依赖。
注意这里多了个父项的选择。
我们看一下子模块的目录结构,会发现它和普通Maven项目没有什么区别。
我们再看一下父模块的pom.xml,会发现多了
packaging为pom,表示选择最简单的打包方式,生成的构件只有它本身。而modules则表示子模块相对于当前模块的路径。我们再看一下子模块中的pom.xml文件中的内容。
parent标签表示该模块继承的父模块信息,包括artifactId、groupId、version等,其实这里还省略了relativePath标签,默认relativePath的值是**../pom.xml**,由于子模块在父模块的下级目录。所以这个标签一般是不用写的。倘若子模块与父模块的位置发生改变,那么这里就要对relativePath进行声明。
parent标签外的artifactId是子模块组件的id,由于声明了父模块,所以子模块中的groupId、version继承自父模块,可以不用填写。
子模块的依赖
若模块二依赖于模块一,则可以像引入Maven依赖一样,在模块二的pom.xml中,利用dependencies标签引入模块一。
需要注意的是,模块间的相互依赖,需要处理好各模块之间的依赖关系,否则容易导致循环依赖或者版本冲突。
关于依赖版本的控制
由于将项目拆分为多个子模块,子模块继承了父模块的一些信息。为了方便管理整个项目的依赖的版本,我们可以在父模块中对依赖版本进行声明,而子模块在声明依赖时,只需声明groupId、artifactId即可。
父模块
子模块
最后
以上内容其实是自己在做项目的过程中,对Maven多模块管理具体实现的记录。由于一些不可控降低原因,直到项目尾声后才想起来做一个笔记。Maven的强大远远不止于此,还有许多功能等着我去发现。