目录
一、分模块设计与开发
1.1 不分模块的问题
1.2 分模块设计
二、 继承与聚合
2.1 继承
2.1.1 继承关系
2.1.2 版本锁定
2.1.2.1 场景
2.1.2.2 介绍
2.1.2.3 实现
2.1.2.4 属性配置
2.2 聚合
2.2.1 介绍
2.2.2 实现
2.3 继承与聚合对比
三、Maven打包方式(jar、war、pom)
所谓分模块设计,顾名思义指的就是我们在设计一个 Java 项目的时候,将一个 Java 项目拆分成多个模块进行开发。
如果项目不分模块,也就意味着所有的业务代码是不是都写在这一个 Java 项目当中。随着这个项目的业务扩张,项目当中的业务功能可能会越来越多。
假如我们开发的是一个大型的电商项目,里面可能就包括了商品模块的功能、搜索模块的功能、购物车 模块、订单模块、用户中心等等。这些所有的业务代码我们都在一个 Java 项目当中编写。 这个项目组至少几十号甚至几百号开 发人员,这些开发人员全部操作这一个 Java 项目。此时大家就会发现我们项目管理和维护起来将会非常的困难。而且大家再来看,假如在我们的项目当中,我们自己定义了一些通用的工具类以及通用的组件,而公司还有其他的项目组,其他项目组也想使用我们所封装的这些组件和工具类,其实是非常不方便的。因为 Java 项目当中包含了当前项目的所有业务代码,所以就造成了这里面所封装的一些组件会难以复用。
总结:不方便项目的维护和管理、项目中的通用组件难以复用。
比如我们可以将商品的相关功能放在商品模块当中,搜索的相关业务功能我都封装在搜索模块当中,还 有像购物车模块、订单模块。而为了组件的复用,我们也可以将项目当中的实体类、工具类以及我们定 义的通用的组件都单独的抽取到一个模块当中。
如果当前这个模块,比如订单模块需要用到这些实体类以及工具类或者这些通用组件,此时直接在订单 模块当中引入工具类的坐标就可以了。这样我们就将一个项目拆分成了若干个模块儿,这就是分模块设计。
分模块设计之后,大家再来看。我们在进行项目管理的时候,我就可以几个人一组,几个人来负责订单模块儿,另外几个人来负责购物车模块儿,这样更加便于项目的管理以及项目的后期维护。
而且分模块设计之后,如果我们需要用到另外一个模块的功能,我们直接依赖模块就可以了。比如商品模块、搜索模块、购物车订单模块都需要依赖于通用组件当中封装的一些工具类,我只需要引入通用组件的坐标就可以了。
分模块设计就是将项目按照功能结构拆分成若干个子模块,方便项目的管理维护、拓展,也方便模块键的相互调用、资源共享。
具体实现
创建模块
创建完模块以后可以在模块的pom文件中引入模块相关的依赖
总结:
1). 什么是分模块设计:将项目按照功能拆分成若干个子模块
2). 为什么要分模块设计:方便项目的管理维护、扩展,也方便模块间的相互调用,资源共享
3). 注意事项:分模块设计需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分
我们可以再创建一个父工程 tlias-parent ,然后让上述的三个模块 tlias-pojo、tlias-utils、tlias-web-management 都来继承这个父工程 。 然后再将各个模块中都共有的依赖,都提取到父工程 tlias-parent中进行配置,只要子工程继承了父工程,依赖它也会继承下来,这样就无需在各个子工程中进行配置了。
接下来我们就来创建一个 parent 父工程,我们就可以将各个子工程当中共有的这部分依赖 统一的定义在父工程 parent 当中,从而来简化子工程的依赖配置。
注意:
父工程打包方式为pom(默认为jar)
思路分析:我们当前的项目因为是一个springboot项目,而 所有的springboot项目都有一个统一的父工程,就是spring-boot-starter-parent。 与java 语言类似,Maven不支持多继承,一个maven项目只能继承一个父工程,如果继承了spring-boot-starter-parent,就没法继承我们自己定义的父工程 tlias-parent了。
那我们怎么来解决这个问题呢?
那此时,大家可以想一下,Java虽然不支持多继承,但是可以支持多重继承,比如:A 继承 B, B 继承C。 那在Maven中也是支持多重继承的,所以呢,我们就可以让 我们自己创建的三个模块,都继承tparent,而parent 再继承 spring-boot-starter-parent,就可以了。
具体结构如下:
1). 父工程的pom.xml文件配置如下:
2). 在子工程的pom.xml文件中,配置继承关系。
注意:
在子工程中,配置了继承关系之后,坐标中的groupId是可以省略的,因为会自动继承父工程的 。
relativePath指定父工程的pom文件的相对位置(如果不指定,将从本地仓库/远程仓库查 找该工程)。
3). 在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)。
如果项目中各个模块中都公共的这部分依赖,我们可以直接定义在父工程中,从而简化子工程的配置。 然而在项目开发中,还有一部分依赖,并不是各个模块都共有的,可能只是其中的一小部分模块中使用到了这个依赖。
比如:在tlias-web-management、tlias-web-system、tlias-web-report这三个子工程中, 都使用到了jwt的依赖。 但是 tlias-pojo、tlias-utils中并不需要这个依赖,那此时,这个依赖,我们不会直接配置在父工程 tlias-parent中,而是哪个模块需要,就在哪个模块中配置。
而由于是一个项目中的多个模块,那多个模块中,我们要使用的同一个依赖的版本要一致,这样便于项目依赖的统一管理。比如:这个jwt依赖,我们都使用的是 0.9.1 这个版本。
那假如说,我们项目要升级,要使用到jwt最新版本 0.9.2 中的一个新功能,那此时需要将依赖的版 本升级到0.9.2,那此时该怎么做呢 ?
第一步:去找当前项目中所有的模块的pom.xml配置文件,看哪些模块用到了jwt的依赖。
第二步:找到这个依赖之后,将其版本version,更换为 0.9.2。
问题:如果项目拆分的模块比较多,每一次更换版本,我们都得找到这个项目中的每一个模块,一个一个的更改。 很容易就会出现,遗漏掉一个模块,忘记更换版本的情况。
那我们又该如何来解决这个问题,如何来统一管理各个依赖的版本呢?
答案:Maven的版本锁定功能。
在maven中,可以在父工程的pom文件中通过 来统一管理依赖版本。
注意:
接下来,我们就可以将tlias-utils模块中单独配置的依赖,将其版本统一交给 tlias-parent 进 行统一管理。
1). tlias-parent 中的配置
io.jsonwebtoken
jjwt
0.9.1
com.aliyun.oss
aliyun-sdk-oss
3.15.1
javax.xml.bind
jaxb-api
2.3.1
javax.activation
activation
1.1.1
org.glassfish.jaxb
jaxb-runtime
2.3.3
2). tlias-utils中的pom.xml配置 如果依赖的版本已经在父工程进行了统一管理,所以在子工程中就无需再配置依赖的版本了。
io.jsonwebtoken
jjwt
com.aliyun.oss
aliyun-sdk-oss
javax.xml.bind
jaxb-api
javax.activation
activation
org.glassfish.jaxb
jaxb-runtime
org.springframework.boot
spring-boot-starter-web
我们也可以通过自定义属性及属性引用的形式,在父工程中将依赖的版本号进行集中管理维护。 具体语法为:
接下来,我们就可以在父工程中,将所有的版本号,都集中管理维护起来。
11
11
1.18.24
0.9.1
3.15.1
2.3.1
1.1.1
2.3.3
org.projectlombok
lombok
${lombok.version}
io.jsonwebtoken
jjwt
${jjwt.version}
com.aliyun.oss
aliyun-sdk-oss
${aliyun.oss.version}
javax.xml.bind
jaxb-api
${jaxb.version}
javax.activation
activation
${activation.version}
org.glassfish.jaxb
jaxb-runtime
${jaxb.runtime.version}
分模块设计与开发之后啊,我们的项目被拆分为多个模块,而模块之间的关系,可能错综复杂。
那此时,大家试想一下,如果开发一个大型项目,拆分的模块很多,模块之间的依赖关系错综复杂,那此时要进行项目的打包、安装操作,是非常繁琐的。 而我们接下来,要讲解的maven的聚合就是来解 决这个问题的,通过maven的聚合就可以轻松实现项目的一键构建(清理、编译、测试、打包、安装等)。
在maven中,我们可以在聚合工程中通过设置当前聚合工程所包含的子模块的名称。例如我们可以在 tlias-parent中,添加如下配置,来指定当前聚合工程,需要聚合的模块:
那此时,我们要进行编译、打包、安装操作,就无需在每一个模块上操作了。只需要在聚合工程上,统 一进行操作就可以了。
jar:普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)
war:普通web程序打包,需要部署在外部的tomcat服务器中运行
pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理