1. 分模块开发与设计
1.1 分模块开发的意义
1.1.1 「分模块开发」核心问题&答案
问题
- 项目为什么要进行模块拆分?
点击查看代码
目的:项目的扩展性变强了,方便其他项目引用相同的功能。
场景 1
- 不同项目采用同一个功能模块
场景 2
- 将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享
场景 3
- 下图是商城的一个后台,有诸多模块,如果你是项目经理,这所有的功能放在一个模块中,试想代码好维护吗?
1.2 分模块开发(模块拆分)
1.2.1 「分模块开发」核心问题&答案
问题
- 在实际开发中,先拆模块后开发,还是先开发代码后拆分?
点击查看代码
- 分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分
1.2.1 拆分步鄹
1️⃣ 创建 Maven 模块
2️⃣ 书写模块代码,将之前包中的代码,拆分成模块
3️⃣ 通过 maven 指令安装模块到本地仓库(install 指令)
注意事项:
- 团队内部开发需要发布模块功能到团队内部可共享的仓库中(私服) ⚠️
1.3 分模块开发 练习 ✏️
1.3.0「分模块开发」目的
熟悉模块拆分
1.3.1「分模块开发」需求&效果
将 ssm 项目进行拆分,拆分后执行 ssm 模块,仍然可以运行(增删改查)
1.3.2「分模块开发 」步鄹
1️⃣ 在飞秋中下载 springday06_maven.zip 压缩包,放到你的工程中
2️⃣ 导入到项目中
3️⃣ 完成数据库连接信息修改,按照下图的序号进行操作
注意:导工程后,一定要做的三个步鄹
- 检查 Maven 仓库
- 检查 jdk-1.8
- 检查编译器版本-1.8
提问:
- 出现下列错误,怎么处理?
2.依赖管理
- 依赖管理指当前项目运行所需的 jar,一个项目可以设置多个依赖
点击查看
- dependencies下面有多个dependency
- 单个依赖(dependency)由G(组织)、A(项目)、V(版本) 组成
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
2.1 依赖传递
2.1.1 「依赖传递」核心问题&答案
问题
A 依赖 B,B 依赖 C,A 是否依赖于 C 呢?
点击查看
- 依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
2.2 可选依赖和排除依赖
2.2.1 「可选依赖和排除依赖」核心问题&答案
问题
- A 依赖 B,B 依赖 C,如果 C 不想被 A 依赖,是否可以做到?
- A 依赖 B,B 依赖 C,如果 A 不想将 C 依赖进来,是否可以做到?
点击查看
- 1️⃣ 可选依赖指对外隐藏当前所依赖的资源————不透明
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递性-->
<optional>false</optional>
</dependency>
- 2️⃣ 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本————不需要
- 排除依赖资源仅指定 GA 即可,无需指定 V
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_04_dao</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖是隐藏当前资源对应的依赖关系-->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
2.2.2 可选依赖和排除依赖的区别 🍐 ❤️
总结
总结:
- 你不给我看你的秘密,--可选---dao 说:我的某些依赖,不想给你 (ssm)
- 我不想看你的密码,----排除 --- ssm 说: 我不要的你(dao)的依赖中的 某些依赖
实际工作场景:
- 实际开发中,一般用别人的代码较多,会较多的使用排除依赖。
- 因为:有一些依赖不想用(有更好的),不能用(有安全问题)这时候需要用到排除依赖。
3.聚合与继承
3.1 聚合工程 【重点】 ❤️
3.1.1 「聚合工程」核心问题&答案
问题
- 什么叫聚合?
点击查看代码
聚合:将多个模块 组织成一个整体,同时进行项目构建的过程称为聚合
聚合工程:通常是一个不具有业务功能的”空“工程(有且仅有一个 pom 文件)
作用:使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建
- 当工程中某个模块发生更新(变更)时 ,必须保障工程中与已更新模块关联的模块同步更新 ,此时可以使用聚合工程来解决批量模块同步构建的问题
3.2 聚合工程 练习 ✏️
3.2.0「聚合工程 」目的
能够使用聚合工程快速构建项目
3.2.1「聚合工程 」需求&效果
使用聚合工程执行统一的操作(clean compile package 等)
3.2.2「聚合工程 」步鄹
- 在飞秋中下载 springday06_maven 压缩包,放到你的工程中(如果练习 1 完成了,不需要导入)
- 导入到项目中
- 注意:导工程后,一定要做的三个步鄹
- 检查 Maven 仓库
- 检查 jdk-1.8
- 检查编译器版本-1.8
点击查看步鄹
1️⃣ 创建 Maven 模块,设置打包类型为 pom
<packaging>pom</packaging>
注意事项:
- 每个 maven 工程都有对应的打包方式,默认为 jar,web 工程打包方式为 war
2️⃣ 设置当前聚合工程所包含的子模块名称
<modules>
<module>../maven_ssm</module>
<module>../maven_pojo</module>
<module>../maven_dao</module>
</modules>
注意事项:
- 聚合工程中所包含的模块在进行构建时会根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。
- 参与聚合的工程无法向上感知是否参与聚合,只能向下配置哪些模块参与本工程的聚合。
3️⃣ 测试聚合工程
- 点击 maven_01_parent(root)模块的 complie 指令,观察控制台。
3.3 继承关系【重点】 ❤️
3.3.1 「继承关系」核心问题&答案
问题 1
- 什么叫继承?以及继承的作用?
点击查看代码
- 概念:
- 继承描述的是两个工程间的关系,与 java 中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承 👈
- 作用:
- 简化配置
- 减少版本冲突
问题 2
- 工程模块 重复配置,一样,能不能简化
- 一部分重复,能不能简化
- 快速修改版本
点击查看图解
3.3.2 继承关系开发
1️⃣ 创建 Maven 模块,设置打包类型为 pom
<packaging>pom</packaging>
注意事项:
- 建议父工程打包方式设置为 pom
2️⃣ 在父工程的 pom 文件中配置依赖关系(子工程将沿用父工程中的依赖关系)
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
……
</dependencies>
3️⃣ 配置子工程中可选的依赖关系
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
……
</dependencies>
</dependencyManagement>
4️⃣ 在子工程中配置当前工程所继承的父工程
<!--定义该工程的父工程-->
<parent>
<groupId>com.itheima</groupId>
<artifactId>maven_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!--填写父工程的pom文件,根据实际情况填写-->
<relativePath>../maven_parent/pom.xml</relativePath>
</parent>
4.5 在子工程中配置使用父工程中可选依赖的坐标
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
</dependencies>
注意事项:
- 子工程中使用父工程中的可选依赖时,仅需要提供群组 id 和项目 id,无需提供版本,版本由父工程统一提供,避免版本冲突
- 子工程中还可以定义父工程中没有定义的依赖关系
3.3.3 聚合与继承的区别【重点】 🍐 ❤️
总结
- 作用
- 聚合用于快速构建项目
- 继承用于快速配置
- 相同点:
- 聚合与继承的 pom.xml 文件打包方式均为 pom,可以将两种关系制作到同一个 pom 文件中
- 聚合与继承均属于设计型模块,并无实际的模块内容
- 不同点:
- 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
- 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
4.属性管理
4.1 属性
4.1.1 「属性」核心问题&答案
问题
- 定义属性有什么好处?
点击查看代码
- 方便维护
4.2 pom 加载属性 🍐
4.2.1 属性配置与使用 🍐 ❤️
1️⃣ 定义属性
<!--定义自定义属性-->
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
下面的属性记得吗??是什么意思吗?
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
2️⃣ 引用属性
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
4.2.2 资源文件引用属性 🚀
1️⃣ 在pom.xml中 定义属性
<!--定义自定义属性-->
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
</properties>
2️⃣ 在jdbc.properties配置文件中引用属性
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=root
3️⃣ 在pom.xml中开启资源文件目录加载属性的过滤器
<build>
<resources>
<resource>
<!-- 内置属性 可以通过cmd mvn help:system-->
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
4️⃣ 配置 maven 打 war 包时,忽略 web.xml 检查
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
注意:也可以创建一个web.xml文件,欺骗一下 简单实用
4.2.3 其他属性(了解)
点击查看详情
属性列表
- 自定义属性(常用)
- 内置属性
- Setting 属性
- Java 系统属性
- 环境变量属性
** 注意** :pom 文件中的属性值可以传递到 配置文件(如:propertis 或者 yml)中
4.3 版本管理 🍐
4.3.1 「版本管理」核心问题&答案
问题
- 项目开发的版本可以分为哪几种?
点击查看代码
工程版本
- SNAPSHOT(快照版本)
- 项目开发过程中临时输出的版本,称为快照版本
- 快照版本会随着开发的进展不断更新
- RELEASE(发布版本)
- 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的
- 即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本
发布版本
- alpha 版
- beta 版
- 纯数字版
5.多环境配置与应用
5.1 多环境配置作用 🍐
5.1.1 「多环境配置作用」核心问题&答案
问题
- 多环境配置有什么好处?
点击查看代码
- maven 提供配置多种环境的设定,帮助开发者使用过程中快速切换环境
5.2 多环境配置步骤
5.2.1 定义多环境
点击查看代码
<!--定义多环境-->
<profiles>
<!--定义具体的环境:生产环境-->
<profile>
<!--定义环境对应的唯一名称-->
<id>env_dep</id>
<!--定义环境中专用的属性值-->
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
</properties>
<!--设置默认启动-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--定义具体的环境:开发环境-->
<profile>
<id>env_pro</id>
……
</profile>
</profiles>
5.2.2 使用多环境(构建过程)🚀 🚀
【命令】:
mvn 指令 –P 环境定义id
【范例】:
mvn install –P pro_env
5.3 跳过测试(了解) 🚀 🚀
5.3.1 「 跳过测试」核心问题&答案
问题
- 跳过测试在开发中的用途或者场景?
点击查看
- 功能更新中并且没有开发完毕
- 快速打包
5.3.2 跳过测试命令(软件配置) 简单实用
点击查看代码
- mvn install –D skipTests
注意事项:
- 执行的项目构建指令必须包含测试生命周期,否则无效果。例如执行 compile 生命周期,不经过 test 生命周期。
5.3.3 细粒度控制跳过测试(代码配置) 🚀
点击查看代码
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
<!--设置跳过测试-->
<includes>
<!--包含指定的测试用例-->
<include>**/User*Test.java</include>
</includes>
<excludes>
<!--排除指定的测试用例-->
<exclude>**/User*TestCase.java</exclude>
</excludes>
</configuration>
</plugin>
6.私服【重点】 ❤️ 🍐
6.1 私服介绍
6.1.1 「私服介绍」核心问题&答案
问题
- 这里的私服和平时我们听的国服、体验服、欧服等等有什么区别?
点击查看
团队开发现状分析
私服是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题
Nexus
- Sonatype 公司的一款 maven 私服产品
- 下载地址:https://help.sonatype.com/repomanager3/downloadopen in new window
6.1.2 Nexus 安装与启动
点击查看
启动服务器(命令行启动)
- nexus.exe /run nexus
访问服务器(默认端口:8081)
修改基础配置信息
- 安装路径下 etc 目录中 nexus-default.properties 文件保存有 nexus 基础配置信息,例如默认访问端口。
修改服务器运行配置信息
- 安装路径下 bin 目录中 nexus.vmoptions 文件保存有 nexus 服务器启动对应的配置信息,例如默认占用内存空间。
6.1.3 私服资源操作流程分析
点击查看
6.2 私服仓库分类 🍐
6.2.1 「私服仓库分类」核心问题&答案
问题
- 私服仓库分为哪几种?
点击查看
6.3 资源上传与下载
6.3.1 「资源上传与下载」核心问题&答案
问题
- 往私服上传资源是否需要身份认证?在哪里设置认证信息?
点击查看
6.3.2 从私服中下载依赖
1️⃣ 在 maven 的 settings.xml 中<mirrors>
标签中配置,此时就需要注释掉 aliyun 的配置 👈
<servers>
<!--配置访问私服的权限-->
<server>
<id>heima-release</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>heima-snapshot</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
- nexus和settings对应图:
将之前的阿里镜像注释,配置好私服的地址 👈
<mirror>
<id>maven-public</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
- nexus和settings对应图:
- 配置完效果 👈
- 在 idea 中加载配置好的 setting.xml 文件 👈
2️⃣ 在 nexus 中设置允许匿名下载,如果不允许将不会从私服中下载依赖
如果私服中没有对应的 jar,会去中央仓库下载,速度很慢。可以在nexus中配置让私服去阿里云中下载依赖。
6.3.3 上传依赖到私服中 ✏️
1️⃣配置本地仓库访问私服的权限(在 maven 的 settings.xml 的 servers 标签中配置)
<!--id任意,多个server的id不重复就行,后面会用到-->
<servers>
<!--配置访问私服的权限-->
<server>
<id>heima-release</id>
<username>admin</username>
<password>admin</password><!--填写自己设定的登录秘密-->
</server>
<server>
<id>heima-snapshot</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
2️⃣ 配置当前项目访问私服上传资源的保存位置(项目的 pom.xml 文件中配置)
<distributionManagement>
<repository>
<!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码-->
<id>heima-release</id>
<!--如果jar的版本是release版本,那么就上传到这个仓库,根据自己情况修改-->
<url>http://localhost:8081/repository/heima-releases/</url>
</repository>
<snapshotRepository>
<!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码-->
<id>heima-snapshot</id>
<!--如果jar的版本是snapshot版本,那么就上传到这个仓库,根据自己情况修改-->
<url>http://localhost:8081/repository/heima-snapshots/</url>
</snapshotRepository>
</distributionManagement>
注意:要和 maven 的 settings.xml 中 server 中定义的对应
3️⃣ 发布资源到私服命令
也可以点击idea左边的maven中的 deploy命令 简单实用