【SSM学习】04-Maven高级

本文详细介绍了Maven的高级特性,包括分模块开发的重要性,如何进行模块拆分及依赖管理。通过案例展示了如何处理依赖传递、可选依赖和排除依赖,以及聚合与继承的概念。此外,还探讨了属性配置、版本管理和多环境配置的应用,最后提到了私有仓库(Nexus)的安装与使用,以及仓库的分类和资源上传下载流程。
摘要由CSDN通过智能技术生成

SSM(B站黑马)学习笔记

01-1-Spring概述
01-2-Spring IOC
01-3-Spring AOP
01-4-Spring 事务
02-SpringMVC
03-SSM整合
04-Maven高级
05-SpringBoot
06-MyBatisPlus



前言

SSM(B站黑马)学习笔记 04-Maven高级


04-Maven高级

分模块开发与设计

分模块开发的意义

银行系统从建国以后就有,那银行系统长什么样,长什么样不重要,重要的是它经历过了很多的阶段。最早的银行系统是账本,到了上世纪80年代就出现了电子系统,就是黑屏式的DOS窗口操作的,输入1 2 3 4回车执行对应的指令。二十一世纪以后又出现了网上银行,随着在本世纪智能手机的问世我们又有了手机银行APP,甚至现在还有数字化货币,这整体放到一块视为一个系统。你会发现我们的系统已经不简简单单的是有一个模块构成的,因为最早在开发DOS窗口操作模块,网上银行,手机银行APP这些概念都没有提出,是根据科技的发展逐步出现了各种各样对应的功能,因此开发出来了对应的模块。

我们的程序按照功能其实是可以划分成若干个模块的,除了按功能划分以外我们还可以进一步划分,比如现在做一个电商系统避免不了的要用到订单模块和商品模块,这两个功能在企业中是一个人在做,甚至是两个团队在做。那这个时候就有一个问题,做订单模块一定要用到做商品模块这个团队所制作出来的东西。最基本的,做订单模块的时候要去使用商品模块里面的实体类pojo。那这个时候就提出了一个问题,我们做商品开发的这个团队有可能或者说是一定要将它所制作的domain(pojo)其他的团队使用。那这个时候我们就发现原来这块东西要进行模块间的共享,不光是自己用,别人也要用。整个团队开发的东西大家都要用。这个时候就有人提出,我们能不能把domain(pojo)的功能独立的抽取出来,让所有团队都能够使用就像jar包一样让所有的人通过一个坐标(依赖)就可以导到自己的功能中。这就是分模块开发。

  • 将原始模块按照功能拆分成若干子模块,方便模块间的相互调用,接口共享
    • 按照这样的结构进行设计的话,每一层功能只要想进行复用就可以很方便的被别人使用到
    • 好处:对每个模块独立维护、别人想使用的时候也方便

入门案例


案例初始化(上一节SSM整合整块内容)

1.分离pojo模块

新建模块

将pojo移动到新模块(02模块就会报错)

2.将03模块pojo导入到02模块

导入成功后02模块就会出现03模块的依赖

导入成功后02模块就不报错了,我们把其中一部分功能抽出来了,做出独立的模块。然后在原始的使用方(02模块)引用,做到分模块。
注意:企业开发是各做各的,然后引用,不是做好了再拆,这里只是演示

3.编译

04Maven&MyBatis
maven要运行执行的是生命周期的操作,运行最基本要通过编译,运行编译(compile)以后发现报错error,意思是执行生命周期的时候出现了问题,不能够解析到我们的这个依赖,哪个依赖,在我的工程中引用东西了,02引用了03他不能够找到这个artifact。说的简单一点就是,现在02里边写了引用这个03结果找不到。

原因是我们其它的依赖都是从中央仓库下载到本地仓库,本地仓库能找到spring之类的坐标,而我们的con.gdit现在在本地并没有。

解决:将03项目打包放进本地仓库。使用maven生命周期的install命令

再次编译02模块 成功编译

相同方法分离dao层

同样的方法做出dao层的独立模块,对应要使用的Mybatis等相关依赖也要导入到独立模块


启动Tomcat运行ssm项目还是能够正常访问

依赖管理

依赖传递

依赖指当前项目运行所需的jar包,一个项目可以设置多个依赖。例如maven_02_ssm项目中使用的依赖(如图),有自己开发的也有第三方开发的,而有些依赖左边带有箭头有些没有,箭头代表当前使用的依赖又依赖了别的依赖。这时就可以分成两大类,一类是我们pom.xml中直接导入的依赖——直接依赖,另一类是我们使用的依赖又有别的依赖——间接依赖。

因为04模块中也依赖了03模块,我们在02模块把03模块的直接依赖去掉只留下04模块,会发现项目还是可以正常运行。

这种现象称为依赖的传递性——依赖传递。就是当前项目可使用间接依赖
直接依赖和间接依赖是一直存在的,比如下图第二层直接依赖第三层,间接依赖第四层。

依赖传递冲突问题
依赖冲突是普遍存在的,假如上面第4层用的Mybatis 3 下面第5层用Mybatis 2或下面第4层用Mybatis 2用谁的

三种优先方法不用纠结死记,简单粗暴的方法就是调到想要用的依赖就行,maven工具提供了依赖的拓展图,直接显示了依赖的关系和深度

可选依赖

假如现在开发了一套程序,里面依赖了一些东西,为了不让别人知道他用到了哪些依赖,想把一些使用的依赖隐藏起来。为什么有这样的想法?假如我当前项目里面用到了一个依赖版本是5.1,但是又担心回头这套东西别人用的时候出现冲突问题。于是就干脆不告诉你,隐藏对外的资源依赖关系(切断依赖传递),就没有冲突问题了。

例如隐藏04dao模块中的03pojo依赖
隐藏前 因为依赖传递性所以02模块还能使用pojo

使用标签隐藏后 切断了依赖传递,02模块无法引用03pojo模块
true隐藏 fasle不隐藏

排除依赖

有时使用第三方依赖我们是无法在其内部设置可选依赖,而我们又不需要第三方资源的一些依赖。例如第三方资源日志使用log4j我们要在当前项目中剔除掉。

排除前

排除后
注意:不用写版本号,因为直接排除这门技术

可选依赖和排除依赖的区别,可选依赖是不给别人用,排除依赖是不用别人的。效果虽然相似,但功能完全不一样

聚合与继承

聚合

为避免修改单一模块导致其它模块不能使用,例如修改pojo模块往里增/减一个字段,其它不能用了。如果其它模块能够同时构建,出问题就能发现。这时就需要聚合工程用来管理其它模块,一个模块更新四个模块同时构建。在聚合工程点compile四个以前compile,点install四个一起install

新建聚合工程

修改打包方式为pom

编译
编译后四个工程都参与构建了
它构建的顺序会根据相互的依赖关系自动分配顺序,如图其它三个都依赖pojo所以它最先构建

继承

各个工程存在重复配置依赖的问题

  • 概念:继承描述的是两个工程间的关系,与Java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承
  • 作用:
    • 简化配置
    • 减少版本冲突 (统一依赖版本)




案例:
1.在子工程中描述继承关系

2.配置父工程依赖(配置大部分类都要用的) 删除部分子工程依赖
刷新maven后02继承了01的依赖

同样的方法让04也继承01

设置可选继承依赖 在标签内的依赖子工程可自行选择是否继承不强制继承。

子工程选择继承 直接写junit依赖不用写版本

属性

属性

场景:统一修改版本号时,依赖过多容易出现漏改的情况导致冲突

解决方法:使用类似于变量统一修改 (属性),下图String只是便于理解


定义属性
<properties>标签内定义 标签名即为属性名 使用${}引用

配置文件加载属性
拓展属性的使用范围(在jdbc.properties文件中也使用pom.xml定义的属性 个人觉得太麻烦了没必要)



案例
1.pom.xml定义属性并在jdbc.properties引用

2.扩大maven控制范围
中间两段作用是让其到指定目录里的文件可以解析${} 而且这组数据通过maven读取到
刷新后01工程就会出现引用resources文件,因为继承的关系子项目也会出现引用resources文件

3.查看是否引用成功
可以不用启动工程,把02工程打包成一个war包查看配置是否加载成功
对01聚合工程执行install命令,让四个工程一起安装到本地仓库
执行后会发现报错,原因是maven在进行打war包的时候,它认为war包必须要web.xml文件,所以会出错(奇怪,我的项目没有也不报错)

解决办法1,新建一个空的web.xml文件
web.xml空文件

解决办法2,使用插件

上述方法二选一构建成功后找到war包内的jdbc.properties文件
加载成功

存在的问题
如果要加载多个resources怎么办,这里只支持写一个

使用${project.basedir}属性,该属性表示当前项目所在目录,因为子项目继承了01,所以子项目里面也具有了这样的功能,相当于每个项目都写了<directory>${project.basedir}/src/main/resources</directory>

版本管理

多环境配置与应用

多环境开发

一个项目在开发环境中用的本机数据库,上线运行后在生产环境中的数据库肯定不是本机,给到测试也有专门的数据库。那这样要写三套配置,让程序多环境开发

  • maven提供配置多种环境的设定,帮助开发者使用过程中快速切换环境

案例
先注释掉原先连接配置

配置多环境
可设置某个配置是否为默认启动环境

install后就会连接默认环境

切换环境
方法一
右边菜单栏Profiles内选择对应的id install后进行切换

方法二:使用maven命令
mvn install -P 指定名称

跳过测试

maven每次执行指令的时候,如果它需要进行测试这个测试过程是无法避免的

此过程能够保证程序打包的是正常的,但有些时候可能有特殊情况,希望它直接打包跳过测试。


通过测试案例
方法1:点击右边菜单栏处的蓝色闪电按钮
此方法有个弊端,就是一下全部跳过了,无法指定跳过

方法2:使用maven命令
mvn 指令 -D skipTests

方法3:指定跳过
测试是一个插件,只能在插件的基础上进行工作
1.找到测试插件的名称

2.配置插件
全跳过

整体不跳过,排除不参与测试的内容

私服

私服简介

替代中央服务器出现的新的服务器,它的作用范围是在开发团队中或者是一个公司内的

  • 私服是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题

搭建Maven私服的方式有很多,以下是其中一种使用量比较大的实现方式:

  • Nexus
    • Sonatype公司的一款maven私服产品
    • 下载地址:https://help.sonatype.com/repomanager3/download
私服安装

打开网址,根据需要选择对应的版本下载(下载网址打不开,用资料里的吧)

将压缩包解压(两个文件)

启动私服

打开第一个文件的bin,使用cmd进入该目录 (注意,目录不能有中文

输入指令:nexus.exe /run nexus

这是相当于Tomcat服务器,要在网页使用 localhost:8081 默认端口8081

点击登录

弹出向导 根据提示进行相关设置

私服仓库分类

私服资源操作流程分析

(1)在没有私服的情况下,我们自己创建的服务都是安装在Maven的本地仓库中

(2)私服中也有仓库,我们要把自己的资源上传到私服,最终也是放在私服的仓库中

(3)其他人要想使用你所上传的资源,就需要从私服的仓库中获取

(4)当我们要使用的资源不是自己写的,是远程中央仓库有的第三方jar包,这个时候就需要从远程中央仓库下载,每个开发者都去远程中央仓库下速度比较慢(中央仓库服务器在国外),私服就再准备一个仓库,用来专门存储从远程中央仓库下载的第三方jar包,第一次访问没有就会去远程中央仓库下载,下次再访问就直接走私服下载

(5)前面在介绍版本管理的时候提到过有SNAPSHOT(临时版)和RELEASE(正式版),如果把这两类的都放到同一个仓库,比较混乱,所以私服就把这两个种jar包放入不同的仓库

(6)上面我们已经介绍了有三种仓库,一种是存放SNAPSHOT的,一种是存放RELEASE还有一种是存放从远程仓库下载的第三方jar包,那么我们在获取资源的时候要从哪个仓库种获取呢?

(7)上传可以上传到指定仓库,但下载又指定仓库就很麻烦。为了方便获取,我们将所有的仓库编成一个组,我们只需要访问仓库组去获取资源。

所有私服仓库总共分为三大类:

宿主仓库hosted

  • 保存无法从中央仓库获取的资源
    • 自主研发(各项目组都有一个仓库)
    • 第三方非开源项目,比如Oracle,因为是付费产品,所以中央仓库没有

代理仓库proxy

  • 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库

仓库组group

  • 将若干个仓库组成一个群组,简化配置
  • 仓库组不能保存资源,属于设计型仓库
资源上传与下载

暂时跳过


注:

该内容是根据B站黑马程序员学习时所记,相关资料可在B站查询:黑马程序员2022最新SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值