自己怎么用h5做网站,肇庆seo,嘉兴网站建设网站建设,石家庄个人做网站Maven高级-分模块开发依赖管理1#xff0c;分模块开发1.1 分模块开发设计1.2 分模块开发实现1.2.1 环境准备1.2.2 抽取domain层步骤1:创建新模块步骤2:项目中创建domain包步骤3:删除原项目中的domain包步骤4:建立依赖关系步骤5:编译maven_02_ssm项目步骤6:将项目安装本地…
Maven高级-分模块开发依赖管理1分模块开发1.1 分模块开发设计1.2 分模块开发实现1.2.1 环境准备1.2.2 抽取domain层步骤1:创建新模块步骤2:项目中创建domain包步骤3:删除原项目中的domain包步骤4:建立依赖关系步骤5:编译maven_02_ssm项目步骤6:将项目安装本地仓库1.2.3 抽取Dao层步骤1:创建新模块步骤2:项目中创建dao包步骤3:删除原项目中的dao包步骤4:将项目安装到本地仓库1.2.4 运行测试并总结2依赖管理2.1 依赖传递与冲突问题2.2 可选依赖和排除依赖方案一:可选依赖方案二:排除依赖目标 理解并实现分模块开发 1分模块开发 1.1 分模块开发设计
(1)按照功能拆分
我们现在的项目都是在一个模块中比如前面的SSM整合开发。虽然这样做功能也都实现了但是也存在了一些问题我们拿银行的项目为例来聊聊这个事。
网络没有那么发达的时候我们需要到银行柜台或者取款机进行业务操作随着互联网的发展,我们有了电脑以后就可以在网页上登录银行网站使用U盾进行业务操作再来就是随着智能手机的普及我们只需要用手机登录APP就可以进行业务操作
上面三个场景出现的时间是不相同的如果非要把三个场景的模块代码放入到一个项目那么当其中某一个模块代码出现问题就会导致整个项目无法正常启动从而导致银行的多个业务都无法正常班理。所以我们会按照功能将项目进行拆分。
(2)按照模块拆分
比如电商的项目中有订单和商品两个模块订单中需要包含商品的详细信息所以需要商品的模型类商品模块也会用到商品的模型类这个时候如果两个模块中都写模型类就会出现重复代码后期的维护成本就比较高。我们就想能不能将它们公共的部分抽取成一个独立的模块其他模块要想使用可以像添加第三方jar包依赖一样来使用我们自己抽取的模块这样就解决了代码重复的问题,这种拆分方式就说我们所说的按照模块拆分。 经过两个案例的分析我们就知道:
将原始模块按照功能拆分成若干个子模块方便模块间的相互调用接口共享。
刚刚我们说了可以将domain层进行拆分除了domain层我们也可以将其他的层也拆成一个个对立的模块如: 这样的话项目中的每一层都可以单独维护也可以很方便的被别人使用。关于分模块开发的意义我们就说完了说了这么多好处那么该如何实现呢? 1.2 分模块开发实现
前面我们已经完成了SSM整合接下来咱们就基于SSM整合的项目来实现对项目的拆分。 1.2.1 环境准备
将资料\maven_02_ssm部署到IDEA中将环境快速准备好部署成功后项目的格式如下: 1.2.2 抽取domain层 步骤1:创建新模块
创建一个名称为maven_03_pojo的jar项目,为什么项目名是从02到03这样创建原因后面我们会提到这块的名称可以任意。 步骤2:项目中创建domain包
在maven_03_pojo项目中创建com.itheima.domain包并将maven_02_ssm中Book类拷贝到该包中 步骤3:删除原项目中的domain包
删除后maven_02_ssm项目中用到Book的类中都会有红色提示如下: **说明:**出错的原因是maven_02_ssm中已经将Book类删除所以该项目找不到Book类所以报错
要想解决上述问题我们需要在maven_02_ssm中添加maven_03_pojo的依赖。 步骤4:建立依赖关系
在maven_02_ssm项目的pom.xml添加maven_03_pojo的依赖
dependencygroupIdcom.itheima/groupIdartifactIdmaven_03_pojo/artifactIdversion1.0-SNAPSHOT/version
/dependency因为添加了依赖所以在maven_02_ssm中就已经能找到Book类所以刚才的报红提示就会消失。 步骤5:编译maven_02_ssm项目
编译maven_02_ssm你会在控制台看到如下错误 错误信息为不能解决maven_02_ssm项目的依赖问题找不到maven_03_pojo这个jar包。
为什么找不到呢?
原因是Maven会从本地仓库找对应的jar包但是本地仓库又不存在该jar包所以会报错。
在IDEA中是有maven_03_pojo这个项目所以我们只需要将maven_03_pojo项目安装到本地仓库即可。 步骤6:将项目安装本地仓库
将需要被依赖的项目maven_03_pojo使用maven的install命令把其安装到Maven的本地仓库中。 安装成功后在对应的路径下就看到安装好的jar包 **说明:**具体安装在哪里和你们自己电脑上Maven的本地仓库配置的位置有关。
当再次执行maven_02_ssm的compile的命令后就已经能够成功编译。 1.2.3 抽取Dao层 步骤1:创建新模块
创建一个名称为maven_04_dao的jar项目 步骤2:项目中创建dao包
在maven_04_dao项目中创建com.itheima.dao包并将maven_02_ssm中BookDao类拷贝到该包中 在maven_04_dao中会有如下几个问题需要解决下: 项目maven_04_dao的BookDao接口中Book类找不到报错 解决方案在maven_04_dao项目的pom.xml中添加maven_03_pojo项目 dependenciesdependencygroupIdcom.itheima/groupIdartifactIdmaven_03_pojo/artifactIdversion1.0-SNAPSHOT/version/dependency
/dependencies项目maven_04_dao的BookDao接口中Mybatis的增删改查注解报错 解决方案在maven_04_dao项目的pom.xml中添加mybatis的相关依赖 dependenciesdependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.6/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.47/version/dependency
/dependencies步骤3:删除原项目中的dao包
删除Dao包以后因为maven_02_ssm中的BookServiceImpl类中有使用到Dao的内容所以需要在maven_02_ssm的pom.xml添加maven_04_dao的依赖
dependencygroupIdcom.itheima/groupIdartifactIdmaven_04_dao/artifactIdversion1.0-SNAPSHOT/version
/dependency此时在maven_02_ssm项目中就已经添加了maven_03_pojo和maven_04_dao包 再次对maven_02_ssm项目进行编译又会报错如下: 和刚才的错误原因是一样的maven在仓库中没有找到maven_04_dao,所以此时我们只需要将maven_04_dao安装到Maven的本地仓库即可。 步骤4:将项目安装到本地仓库
将需要被依赖的项目maven_04_dao使用maven的install命令把其安装到Maven的本地仓库中。 安装成功后在对应的路径下就看到了安装好对应的jar包 当再次执行maven_02_ssm的compile的指令后就已经能够成功编译。 1.2.4 运行测试并总结
将抽取后的项目进行运行测试之前的增删改查功能依然能够使用。
所以对于项目的拆分大致会有如下几个步骤:
(1) 创建Maven模块
(2) 书写模块代码
分模块开发需要先针对模块功能进行设计再进行编码。不会先将工程开发完毕然后进行拆分。拆分方式可以按照功能拆也可以按照模块拆。
(3)通过maven指令安装模块到本地仓库(install 指令)
团队内部开发需要发布模块功能到团队内部可共享的仓库中(私服)私服我们后面会讲解。 2依赖管理
我们现在已经能把项目拆分成一个个独立的模块当在其他项目中想要使用独立出来的这些模块只需要在其pom.xml使用标签来进行jar包的引入即可。
其实就是依赖关于依赖管理里面都涉及哪些内容我们就一个个来学习下:
依赖传递可选依赖排除依赖
我们先来说说什么是依赖:
依赖指当前项目运行所需的jar一个项目可以设置多个依赖。
格式为:
!--设置当前项目所依赖的所有jar--
dependencies!--设置具体的依赖--dependency!--依赖所属群组id--groupIdorg.springframework/groupId!--依赖所属项目id--artifactIdspring-webmvc/artifactId!--依赖版本号--version5.2.10.RELEASE/version/dependency
/dependencies2.1 依赖传递与冲突问题
回到我们刚才的项目案例中打开Maven的面板你会发现: 在项目所依赖的这些jar包中有一个比较大的区别就是有的依赖前面有箭头,有的依赖前面没有。
那么这个箭头所代表的含义是什么?
打开前面的箭头你会发现这个jar包下面还包含有其他的jar包 你会发现有两个maven_03_pojo的依赖被加载到Dependencies中那么maven_04_dao中的maven_03_pojo能不能使用呢?
要想验证非常简单只需要把maven_02_ssm项目中pom.xml关于maven_03_pojo的依赖注释或删除掉 在Dependencies中移除自己所添加maven_03_pojo依赖后打开BookServiceImpl的类你会发现Book类依然存在可以被正常使用 这个特性其实就是我们要讲解的依赖传递。
依赖是具有传递性的: 说明: A代表自己的项目B,C,D,E,F,G代表的是项目所依赖的jar包D1和D2 E1和E2代表是相同jar包的不同版本
(1) A依赖了B和C,B和C有分别依赖了其他jar包所以在A项目中就可以使用上面所有jar包这就是所说的依赖传递
(2) 依赖传递有直接依赖和间接依赖
相对于A来说A直接依赖B和C,间接依赖了D1,E1,GF,D2和E2相对于B来说B直接依赖了D1和E1,间接依赖了G直接依赖和间接依赖是一个相对的概念
(3)因为有依赖传递的存在就会导致jar包在依赖的过程中出现冲突问题具体什么是冲突?Maven是如何解决冲突的?
这里所说的依赖冲突是指项目依赖的某一个jar包有多个不同的版本因而造成类包版本冲突。
情况一: 在maven_02_ssm的pom.xml中添加两个不同版本的Junit依赖:
dependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.11/versionscopetest/scope/dependency
/dependencies通过对比会发现一个结论
特殊优先当同级配置了相同资源的不同版本后配置的覆盖先配置的。
情况二: 路径优先当依赖中出现相同的资源时层级越深优先级越低层级越浅优先级越高
A通过B间接依赖到E1A通过C间接依赖到E2A就会间接依赖到E1和E2,Maven会按照层级来选择E1是2度E2是3度所以最终会选择E1
情况三: 声明优先当资源在相同层级被依赖时配置顺序靠前的覆盖配置顺序靠后的
A通过B间接依赖到D1A通过C间接依赖到D2D1和D2都是两度这个时候就不能按照层级来选择需要按照声明来谁先声明用谁也就是说B在C之前声明这个时候使用的是D1反之则为D2
但是对应上面这些结果大家不需要刻意去记它。因为不管Maven怎么选最终的结果都会在Maven的Dependencies面板中展示出来展示的是哪个版本也就是说它选择的就是哪个版本如: 如果想更全面的查看Maven中各个坐标的依赖关系可以点击Maven面板中的show Dependencies 在这个视图中就能很明显的展示出jar包之间的相互依赖关系。 2.2 可选依赖和排除依赖
依赖传递介绍完以后我们来思考一个问题 maven_02_ssm 依赖了 maven_04_daomaven_04_dao 依赖了 maven_03_pojo因为现在有依赖传递所以maven_02_ssm能够使用到maven_03_pojo的内容如果说现在不想让maven_02_ssm依赖到maven_03_pojo有哪些解决方案?
**说明:**在真实使用的过程中maven_02_ssm中是需要用到maven_03_pojo的我们这里只是用这个例子描述我们的需求。因为有时候maven_04_dao出于某些因素的考虑就是不想让别人使用自己所依赖的maven_03_pojo。 方案一:可选依赖
可选依赖指对外隐藏当前所依赖的资源—不透明
在maven_04_dao的pom.xml,在引入maven_03_pojo的时候添加optional
dependencygroupIdcom.itheima/groupIdartifactIdmaven_03_pojo/artifactIdversion1.0-SNAPSHOT/version!--可选依赖是隐藏当前工程所依赖的资源隐藏后对应资源将不具有依赖传递--optionaltrue/optional
/dependency此时BookServiceImpl就已经报错了,说明由于maven_04_dao将maven_03_pojo设置成可选依赖导致maven_02_ssm无法引用到maven_03_pojo中的内容导致Book类找不到。 方案二:排除依赖
排除依赖指主动断开依赖的资源被排除的资源无需指定版本—不需要
前面我们已经通过可选依赖实现了阻断maven_03_pojo的依赖传递对于排除依赖则指的是已经有依赖的事实也就是说maven_02_ssm项目中已经通过依赖传递用到了maven_03_pojo此时我们需要做的是将其进行排除所以接下来需要修改maven_02_ssm的pom.xml
dependencygroupIdcom.itheima/groupIdartifactIdmaven_04_dao/artifactIdversion1.0-SNAPSHOT/version!--排除依赖是隐藏当前资源对应的依赖关系--exclusionsexclusiongroupIdcom.itheima/groupIdartifactIdmaven_03_pojo/artifactId/exclusion/exclusions
/dependency这样操作后BookServiceImpl中的Book类一样也会报错。
当然exclusions标签带s说明我们是可以依次排除多个依赖到的jar包比如maven_04_dao中有依赖junit和mybatis,我们也可以一并将其排除。
dependencygroupIdcom.itheima/groupIdartifactIdmaven_04_dao/artifactIdversion1.0-SNAPSHOT/version!--排除依赖是隐藏当前资源对应的依赖关系--exclusionsexclusiongroupIdcom.itheima/groupIdartifactIdmaven_03_pojo/artifactId/exclusionexclusiongroupIdlog4j/groupIdartifactIdlog4j/artifactId/exclusionexclusiongroupIdorg.mybatis/groupIdartifactIdmybatis/artifactId/exclusion/exclusions
/dependency介绍我这两种方式后简单来梳理下就是
A依赖B,B依赖C,C通过依赖传递会被A使用到现在要想办法让A不去依赖C可选依赖是在B上设置optional,A不知道有C的存在排除依赖是在A上设置exclusions,A知道有C的存在主动将其排除掉。 学习笔记 from 黑马程序员 By – Suki 2023/4/6