多方面的代码集中在一个整体结构中,新入的开发者很难对整体项目有直观的感受,增加了新手介入开发的成本,需要有一个熟悉整个项目的开发者维护整个项目的结构(通常在项目较大且开发时间较长时这是很难做到的)。
开发者对自己或者他人负责的代码边界很模糊,这是复杂项目中最容易遇到的,导致的结果就是开发者很容易修改了他人负责的代码且代码负责人还不知道,责任追踪很麻烦。
将一个复杂项目拆分成多个模块是解决上述问题的一个重要方法。
拆分的好处
多模块的划分可以降低代码之间的耦合性(从类级别的耦合提升到jar包级别的耦合)
每个模块都可以是自解释的(通过模块名或者模块文档)
模块还规范了代码边界的划分,开发者很容易通过模块确定自己所负责的内容
模块拆分策略
推荐安照功能拆分,后期方便转换成微服务架构
按职责划分
--module-test
--module-test-service
--module-test-po
--module-test-controller
--module-test-dao
--module-test-common
--module-test-util
按功能拆分
例如,在电商系统中如下module
--module-test
--module-test-common公共部分
--module-test-order订单
--module-test-checkout购物车
--module-test-pay支付
--module-test-catory类目
--module-test-product商品
--module-test-price价格
--module-test-account账号
搭建多模块项目
搭建多模块项目,需要使用 maven 的继承和聚合,其中聚合负责将多个模块集中在一起进行管理,继承则负责各子模块中的公共配置
我使用的是idea
<
module
>
module-util
</
module
>
</
modules
>
复制代码
pom 是最简单的打包类型。不像jar和war,它生成的构件只有它本身。将
packaging
申明为
pom
则意味着没有代码需要测试或者编译,也没有资源需要处理。
由于我们使用了聚合,所以打包方式必须为pom,否则无法构建。
<modules>
<module>module-util</module>
</modules>
复制代码
module的值是子模块相对于当前 POM 的
路径
。
再看子模块中的 pom
也是分成两个部分
<parent>
<groupId>com.wqlm</groupId>
<artifactId>module</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>module-util</artifactId>
复制代码
<parent>
<groupId>com.wqlm</groupId>
<artifactId>module</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
复制代码
声明了该模块继承自
com.wqlm:module:1.0-SNAPSHOT
,其实这里面还省略了
<relativePath></relativePath>
由于
relativePath
默认是
../pom.xml
而我们的子项目确实在父项目的下一级目录中,所以是可以不用填写的
Maven首先在当前构建项目的环境中查找父pom,然后项目所在的文件系统查找,然后是本地存储库,最后是远程repo。
artifactId
是子模块的组件id,由于继承了父pom,所以
groupId
、
version
也可以不写,不写的话就默认继承自父pom
使用多模块
如上所示,在创建多个模块之后,可以在父pom中添加公共配置,然后所有的子模块都会继承这些配置。除此之外,还可以通用对子模块进行
编译、打包、安装...
操作
子模块间的依赖
如果子模块间相互依赖,需要在
dependency
中引入要依赖的子模块,如图
上图中子模块
module-common:1.0-SNAPSHOT
依赖了
module-util:1.0-SNAPSHOT
。
子模块间的相互依赖,需要管理好依赖项的版本号,负责容易依赖版本冲突。
关于依赖项的版本管理,请参考
maven 依赖版本管理——depencyManagement
简单来说就是把公共依赖及版本号在父 pom 中申明,子项目引入依赖时只需要指定 groupId、artifactId 不需要指定版本号
如下,先在父 pom 中申明依赖及版本号
再在子项目中引入依赖项,注意,不需要指定版本号,默认查找父pom中定义的版本号
maven 继承
maven 聚合
-
495
-
会Coding的猴子
Spring Boot