随着项目的不断发展,需求的不断细化与添加,代码愈来愈多,结构也愈来愈复杂,这时候就会遇到各类问题bash
不一样方面的代码之间相互耦合,这时候一系统出现问题很难定位到问题的出现缘由,即便定位到问题也很难修正问题,可能在修正问题的时候引入更多的问题。架构
多方面的代码集中在一个总体结构中,新入的开发者很难对总体项目有直观的感觉,增长了新手介入开发的成本,须要有一个熟悉整个项目的开发者维护整个项目的结构(一般在项目较大且开发时间较长时这是很难作到的)。maven
开发者对本身或者他人负责的代码边界很模糊,这是复杂项目中最容易遇到的,致使的结果就是开发者很容易修改了他人负责的代码且代码负责人还不知道,责任追踪很麻烦。ide
将一个复杂项目拆分红多个模块是解决上述问题的一个重要方法。 拆分的好处微服务
推荐安照功能拆分,后期方便转换成微服务架构post
例如,在电商系统中以下module测试
搭建多模块项目,须要使用 maven 的继承和聚合,其中聚合负责将多个模块集中在一块儿进行管理,继承则负责各子模块中的公共配置idea
我使用的是ideaspa
删掉srccode
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 dependencyManagement**。 在父pom中加入 dependencyManagement
关于 maven dependencyManagement 详情请参考 maven 依赖版本管理——depencyManagement