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高级
    • 分模块开发与设计
      • 分模块开发的意义
      • 入门案例
        • 1.分离pojo模块
        • 2.将03模块pojo导入到02模块
        • 3.编译
        • 相同方法分离dao层
      • 依赖管理
        • 依赖传递
        • 可选依赖
        • 排除依赖
      • 聚合与继承
        • 聚合
        • 继承
      • 属性
        • 属性
        • 版本管理
      • 多环境配置与应用
        • 多环境开发
        • 跳过测试
      • 私服
        • 私服简介
        • 私服安装
        • 私服仓库分类
        • 资源上传与下载
  • 注:

前言

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企业实用开发技术

【SSM学习】04-Maven高级相关推荐

  1. JavaScript学习笔记04【高级——DOM和事件的简单学习、BOM对象】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  2. maven mybatis mysql_Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问...

    标签: 本篇内容还是建立在上一篇Java Web学习系列--Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Ja ...

  3. Java菜鸟到大牛学习路线之高级篇

    这是一套Java菜鸟到大牛的学习路线之高级教程,由工作了10年的资深Java架构师整理. 01-java高级架构师设计-基础深入         J2SE深入讲解         Java多线程与并发 ...

  4. 动手学习深度学习 04:多层感知机

    文章目录 01 多层感知机 1.感知机 总结 2.多层感知机 2.1.隐藏层 2.1.1 线性模型可能会出错 2.1.2 在网络中加入隐藏层 2.1.3 从线性到非线性 2.1.4 通用近似定理 3. ...

  5. 基于javaweb+jsp的在线点餐系统(java+SSM+jsp+mysql+maven)

    基于javaweb+jsp的在线点餐系统(java+SSM+jsp+mysql+maven) 一.项目简述 功能包括: 在线点餐,评论,购物车,下单,支付,管理员,店家多 商家管理,后台评论管理,订单 ...

  6. 基于javaweb+springboot的水果商城在线商城(java+Springboot+ssm+mysql+jsp+maven)

    基于javaweb+springboot的水果商城在线商城(java+Springboot+ssm+mysql+jsp+maven) 一.项目简述 本系统主要实现的功能有: 前台用户的登录注册,水果商 ...

  7. Maven高级-私服

    Maven高级-私服 6,私服 6.1 私服简介 6.2 私服安装 步骤1:下载解压 步骤2:启动Nexus 步骤3:浏览器访问 步骤4:首次登录重置密码 6.3 私服仓库分类 6.4 本地仓库访问私 ...

  8. 【JAVA程序设计】(C00089)基于SSM(非maven)的仓库出入库管理系统

    基于SSM(非maven)的仓库出入库管理系统 项目简介 项目获取 开发环境 项目技术 相关代码 运行截图 运行视频 项目简介 基于SSM(非maven)的仓库出入库管理系统: 功能简单,适合学习以及 ...

  9. 基于javaweb+jsp的小区物业管理系统(java+SSM+jsp+mysql+maven)

    基于javaweb+jsp的小区物业管理系统(java+SSM+jsp+mysql+maven) 一.项目简述 功能包括: 分为管理员及普通业主角色,业主信息,社区房屋,维护 管理,社区车辆,社区投诉 ...

最新文章

  1. C语言——把结构体数据封装成TLV格式的数据
  2. SVN钩子--hook
  3. 产品经理懂技术=流氓会武术(zz)
  4. c语言统计数字字母个数,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  5. C++结构体:默认构造函数,复制构造函数,重载=运算符
  6. C++函数的三种传递方式
  7. centos7 php多版本切换_CentOS7服务搭建----搭建私有云盘01
  8. 系统学习机器学习之SVM(二)
  9. STM32学习笔记(十) CAN通讯测试(环回模式)
  10. 用树莓派USB摄像头做个监控
  11. 计算机网络实验-----常用网络命令操作
  12. Element.closest() 兼容IE
  13. 路由器设置成交换机步骤
  14. php fopen 追加,PHP文件写入或追加
  15. KVC基本原理和用法
  16. 【Oracle】 选择题汇总
  17. android定位周边,Android 使用高德SDK编写周边搜索定位
  18. Vulkan 简介及其特点
  19. Java对接混合支付、退款、提现心得
  20. 破解wifi密码 暴力破解 保姆式教学

热门文章

  1. 金秋月圆,学习礼包“WAIC可信隐私计算论坛”完整视频已上架!请查收~
  2. CRM客户关系管理系统开发第十九讲——实现客户拜访记录管理模块中条件查询客户拜访记录列表的功能
  3. Codeforces 841B - Godsend
  4. 手把手教你使用pytorch实现双向LSTM机器翻译
  5. 微信订货系统智能化管理,让你的订单从此不再出错
  6. 【软工视频】--需求分析
  7. CV实战 | 使用OpenCV实现道路车辆计数
  8. hive经典面试题4--如何用分时数据计算分时累计数据?如何在分时累计数据为空的时候去补全数据?
  9. 如何将苹果硬盘全部格式化
  10. 较简单的c语言航班管理系统