随着项目的不断发展,需求的不断细化与添加,代码越来越多,结构也越来越复杂,这时候就会遇到各种问题
- 不同方面的代码之间相互耦合,这时候一系统出现问题很难定位到问题的出现原因,即使定位到问题也很难修正问题,可能在修正问题的时候引入更多的问题。
- 多方面的代码集中在一个整体结构中,新入的开发者很难对整体项目有直观的感受,增加了新手介入开发的成本,需要有一个熟悉整个项目的开发者维护整个项目的结构(通常在项目较大且开发时间较长时这是很难做到的)。
- 开发者对自己或者他人负责的代码边界很模糊,这是复杂项目中最容易遇到的,导致的结果就是开发者很容易修改了他人负责的代码且代码负责人还不知道,责任追踪很麻烦。
将一个复杂项目拆分成多个模块是解决上述问题的一个重要方法。 拆分的好处
- 多模块的划分可以降低代码之间的耦合性(从类级别的耦合提升到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
删掉src
pom文件内容
创建子模块
在项目下创建子模块
套路与创建普通项目一致
注意变化
module 的 pom 文件发生了变化
新增了两段配置
<packaging>pom</packaging>
<modules>
<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>
<!--<relativePath/>-->
</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中定义的版本号
作者:我妻礼弥
链接:https://juejin.cn/post/6844903970024980488
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
转载请注明:学时网 » Maven 多模块管理