南通通州区城乡建设局网站,做网上商城网站,中国接单外发加工网,潍坊网站建设 马目录 一、分模块设计与开发 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打包方式#xff08;jar、w… 目录 一、分模块设计与开发 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 项目拆分成多个模块进行开发。
1.1 不分模块的问题 如果项目不分模块也就意味着所有的业务代码是不是都写在这一个 Java 项目当中。随着这个项目的业务扩张项目当中的业务功能可能会越来越多。
假如我们开发的是一个大型的电商项目里面可能就包括了商品模块的功能、搜索模块的功能、购物车 模块、订单模块、用户中心等等。这些所有的业务代码我们都在一个 Java 项目当中编写。 这个项目组至少几十号甚至几百号开 发人员这些开发人员全部操作这一个 Java 项目。此时大家就会发现我们项目管理和维护起来将会非常的困难。而且大家再来看假如在我们的项目当中我们自己定义了一些通用的工具类以及通用的组件而公司还有其他的项目组其他项目组也想使用我们所封装的这些组件和工具类其实是非常不方便的。因为 Java 项目当中包含了当前项目的所有业务代码所以就造成了这里面所封装的一些组件会难以复用。
总结不方便项目的维护和管理、项目中的通用组件难以复用。
1.2 分模块设计 比如我们可以将商品的相关功能放在商品模块当中搜索的相关业务功能我都封装在搜索模块当中还 有像购物车模块、订单模块。而为了组件的复用我们也可以将项目当中的实体类、工具类以及我们定 义的通用的组件都单独的抽取到一个模块当中。
如果当前这个模块比如订单模块需要用到这些实体类以及工具类或者这些通用组件此时直接在订单 模块当中引入工具类的坐标就可以了。这样我们就将一个项目拆分成了若干个模块儿这就是分模块设计。
分模块设计之后大家再来看。我们在进行项目管理的时候我就可以几个人一组几个人来负责订单模块儿另外几个人来负责购物车模块儿这样更加便于项目的管理以及项目的后期维护。
而且分模块设计之后如果我们需要用到另外一个模块的功能我们直接依赖模块就可以了。比如商品模块、搜索模块、购物车订单模块都需要依赖于通用组件当中封装的一些工具类我只需要引入通用组件的坐标就可以了。
分模块设计就是将项目按照功能结构拆分成若干个子模块方便项目的管理维护、拓展也方便模块键的相互调用、资源共享。
具体实现
创建模块 创建完模块以后可以在模块的pom文件中引入模块相关的依赖
总结
1). 什么是分模块设计将项目按照功能拆分成若干个子模块
2). 为什么要分模块设计方便项目的管理维护、扩展也方便模块间的相互调用资源共享
3). 注意事项分模块设计需要先针对模块功能进行设计再进行编码。不会先将工程开发完毕然后进行拆分
二、 继承与聚合 2.1 继承
我们可以再创建一个父工程 tlias-parent 然后让上述的三个模块 tlias-pojo、tlias-utils、tlias-web-management 都来继承这个父工程 。 然后再将各个模块中都共有的依赖都提取到父工程 tlias-parent中进行配置只要子工程继承了父工程依赖它也会继承下来这样就无需在各个子工程中进行配置了。 接下来我们就来创建一个 parent 父工程我们就可以将各个子工程当中共有的这部分依赖 统一的定义在父工程 parent 当中从而来简化子工程的依赖配置。
注意父工程打包方式为pom默认为jar
2.1.1 继承关系
思路分析我们当前的项目因为是一个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). 在父工程中配置各个工程共有的依赖子工程会自动继承父工程的依赖。 2.1.2 版本锁定
2.1.2.1 场景
如果项目中各个模块中都公共的这部分依赖我们可以直接定义在父工程中从而简化子工程的配置。 然而在项目开发中还有一部分依赖并不是各个模块都共有的可能只是其中的一小部分模块中使用到了这个依赖。
比如在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的版本锁定功能。
2.1.2.2 介绍
在maven中可以在父工程的pom文件中通过 来统一管理依赖版本。 注意 2.1.2.3 实现
接下来我们就可以将tlias-utils模块中单独配置的依赖将其版本统一交给 tlias-parent 进 行统一管理。
1). tlias-parent 中的配置 !--统一管理依赖版本--dependencyManagementdependencies!--JWT令牌--dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.1/version/dependency!--阿里云OSS--dependencygroupIdcom.aliyun.oss/groupIdartifactIdaliyun-sdk-oss/artifactIdversion3.15.1/version/dependencydependencygroupIdjavax.xml.bind/groupIdartifactIdjaxb-api/artifactIdversion2.3.1/version/dependencydependencygroupIdjavax.activation/groupIdartifactIdactivation/artifactIdversion1.1.1/version/dependency!-- no more than 2.3.3--dependencygroupIdorg.glassfish.jaxb/groupIdartifactIdjaxb-runtime/artifactIdversion2.3.3/version/dependency/dependencies/dependencyManagement
2). tlias-utils中的pom.xml配置 如果依赖的版本已经在父工程进行了统一管理所以在子工程中就无需再配置依赖的版本了。 dependencies!--JWT令牌--dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactId/dependency!--阿里云OSS--dependencygroupIdcom.aliyun.oss/groupIdartifactIdaliyun-sdk-oss/artifactId/dependencydependencygroupIdjavax.xml.bind/groupIdartifactIdjaxb-api/artifactId/dependencydependencygroupIdjavax.activation/groupIdartifactIdactivation/artifactId/dependency!-- no more than 2.3.3--dependencygroupIdorg.glassfish.jaxb/groupIdartifactIdjaxb-runtime/artifactId/dependency!--WEB开发--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies 2.1.2.4 属性配置
我们也可以通过自定义属性及属性引用的形式在父工程中将依赖的版本号进行集中管理维护。 具体语法为 接下来我们就可以在父工程中将所有的版本号都集中管理维护起来。 propertiesmaven.compiler.source11/maven.compiler.sourcemaven.compiler.target11/maven.compiler.targetlombok.version1.18.24/lombok.versionjjwt.version0.9.1/jjwt.versionaliyun.oss.version3.15.1/aliyun.oss.versionjaxb.version2.3.1/jaxb.versionactivation.version1.1.1/activation.versionjaxb.runtime.version2.3.3/jaxb.runtime.version/propertiesdependenciesdependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/version/dependency/dependencies!--统一管理依赖版本--dependencyManagementdependencies!--JWT令牌--dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion${jjwt.version}/version/dependency!--阿里云OSS--dependencygroupIdcom.aliyun.oss/groupIdartifactIdaliyun-sdk-oss/artifactIdversion${aliyun.oss.version}/version/dependencydependencygroupIdjavax.xml.bind/groupIdartifactIdjaxb-api/artifactIdversion${jaxb.version}/version/dependencydependencygroupIdjavax.activation/groupIdartifactIdactivation/artifactIdversion${activation.version}/version/dependency!-- no more than 2.3.3--dependencygroupIdorg.glassfish.jaxb/groupIdartifactIdjaxb-runtime/artifactIdversion${jaxb.runtime.version}/version/dependency/dependencies/dependencyManagement
面试题
2.2 聚合
分模块设计与开发之后啊我们的项目被拆分为多个模块而模块之间的关系可能错综复杂。 那此时大家试想一下如果开发一个大型项目拆分的模块很多模块之间的依赖关系错综复杂那此时要进行项目的打包、安装操作是非常繁琐的。 而我们接下来要讲解的maven的聚合就是来解 决这个问题的通过maven的聚合就可以轻松实现项目的一键构建清理、编译、测试、打包、安装等。
2.2.1 介绍 2.2.2 实现
在maven中我们可以在聚合工程中通过设置当前聚合工程所包含的子模块的名称。例如我们可以在 tlias-parent中添加如下配置来指定当前聚合工程需要聚合的模块 那此时我们要进行编译、打包、安装操作就无需在每一个模块上操作了。只需要在聚合工程上统 一进行操作就可以了。 2.3 继承与聚合对比 三、Maven打包方式jar、war、pom
jar普通模块打包springboot项目基本都是jar包内嵌tomcat运行
war普通web程序打包需要部署在外部的tomcat服务器中运行
pom父工程或聚合工程该模块不写代码仅进行依赖管理