Maven是一款用于管理和构建Java项目的工具,是apache旗下的一个开源项目。
目录
Maven作用
-
依赖管理:方便快捷的管理项目依赖的资源(jar包)
-
项目结构:标准化的跨平台(linux、Windows、MacOS)的自动化项目构建方式
-
统一项目结构:提供标准、统一的项目结构
Maven概述
介绍
-
Apache Maven是一个项目管理构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。
-
作用:
-
方便的依赖管理
-
白哦准的项目构建流程
-
统一的项目结构
-
-
仓库:用于存储资源,管理各种jar包。
-
本地仓库:自己计算机上的一个目录
-
中央仓库:由Maven团队维护的全球唯一的。仓库地址:Central Repository:
-
远程仓库(私服):一般由公司团队搭建的私有仓库
-
查找顺序:本地仓库 -> 远程仓库 -> 中央仓库
-
安装
-
解压 apache-maven-3.9.4-bin.zip
-
配置本地仓库:修改 conf/settings.xml 中的 <localRepository>为一个指定目录
<localRepository>F:\develop\apache-maven-3.9.4-bin\apache-maven-3.9.4\mvn_repo</localRepository>
-
配置阿里云私服:修改 conf/settings.xml 中的 <mirrors> 标签,为其添加如下子标签:
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
-
配置环境变量:MAVEN_HOME为maven的解压目录,并将其bin目录加入PATH环境变量。
-
测试:打开命令行,输入“mvn -v”,查看是否配置成功
IDEA集成Maven
创建Maven项目
-
配置Maven环境(全局)
-
创建Maven项目
-
创建模块,选择New Module,并填写模块信息,选择构建工具为Maven,点击create,创建完成
-
编写HelloWord,并运行
-
Maven坐标
-
什么是坐标:
-
Maven中的坐标是资源(jar)的唯一标识,通过该坐标可以唯一定位资源位置。
-
使用坐标来定义项目或引入项目中需要的依赖。
-
-
Maven坐标主要组成:
-
groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
-
artifactId:定义当前Maven项目名称(通常是模块名称,例如: order-version、goods-service)
-
version:定义当前项目版本号
-
SNAPSHOT:功能不稳定、尚处于开发中的版本,即快照版本
-
PELEASE:功能趋于稳定、当前更新停止,可以用于发行的版本
-
<groupId>Leaning</groupId> <artifactId>maven-project01</artifactId> <version>1.0-SNAPSHOT</version>
-
导入Maven项目
-
方式一:File -> Project Structure -> Modules -> Import Module ->选择maven项目的pom.xml。
-
方式二:Maven面板 -> +(Add Maven Projects) -> 选择maven项目的pom.xml。
-
注意:
-
建议将要导入的maven项目复制到你的项目目录下
-
建议选择maven项目的pom.xml文件进行导入
-
依赖管理
依赖配置
-
依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖
-
配置:
-
在pom.xml中编写<dependencies>标签
-
在<dependencies>标签中,使用<dependency>引入坐标
-
定义坐标的 groupId ,artifactId ,version
-
点击刷新按钮,引入最新加入的坐标
-
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.4</version>
</dependency>
</dependencies>
-
注意:如果不知道依赖的坐标信息,可以到https://mvnrepository.com中搜索。
依赖排除
-
依赖排除:指主动断开依赖的资源,被排除的资源无需指定版本。
-
标签:<exclusion></exclusion>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.4</version>
<!-- 排除依赖 -->
<exclusions>
<exclusion>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-observation</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
注意事项
-
一旦依赖配置变更了,记得重新加载
-
引入的依赖本地仓库不存在,记得联网
生命周期
-
Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一。
-
Maven中有三套相互独立的生命周期:
每一套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。
-
clean:清理工作。
-
default:核心工作,如:编译、测试、打包、安装、部署等。
-
site:生成报告、发布站点等。
-
-
主要关注五个生命周期的阶段:clean , compile , test , package , install
-
clean:移除(清理)上一次构建生成的文件
-
compile :编译项目源代码
-
test :使用合适的单元测试框架运行测试(junit)
-
package :将编译后的文件打包,如jar、war等
-
install :安装项目到本地仓库
-
注意:在同一套(clean、default、site为三套,同一套)生命周期中,当运行后面的阶段时,前面的阶段都会运行。
-
执行指定生命周期的两种方式:
-
在idea中右侧的maven工具栏,选中对应的生命周期,双击执行。
-
在命令行中,通过命令执行。输入"mvn clean""mvn compile"...即可
-
测试
-
测试:是一种用来促进鉴定软件的正确性、完整性、安全性和质变的过程。
-
阶段划分:单元测试、集成测试、系统测试、验收测试。
-
单元测试
-
介绍:对软件的基本组成单元进行测试,最小测试单元。
-
目的:检验软件基本组成单元的正确性。
-
测试方法:白盒测试
-
测试人员:开发人员
集成测试
-
介绍:将已分别通过测试的单元,按设计要求组合成系统或子系统,再进行的测试。
-
目的:检查单元之间的协作是否正确。
-
测试方法:灰盒测试
-
测试人员:开发人员
系统测试
-
介绍:对已经集成好的软件系统进行彻底的测试。
-
目的:验证软件系统的正确性、性能是否满足指定的要求。
-
测试方法:黑盒测试
-
测试人员:测试人员
验收测试
-
介绍:交付测试,是针对用户需求、业务流程进行的正式的测试。
-
目的:验证软件系统是否满足验收标准。
-
测试方法:黑盒测试
-
测试人员:客户/需求方
-
-
-
测试方法:白盒测试、黑盒测试及灰盒测试。
-
白盒测试
-
清楚软件内部结构、代码逻辑。
-
用于验证代码、逻辑正确性。
黑盒测试
-
不清楚软件内部结构、代码逻辑。
-
用于验证软件的功能、兼容性等方面。
灰盒测试
-
结合了白盒测试和黑盒测试的特点,即关注软件的内部结构又考虑外部表现(功能)。
-
-
单元测试
-
单元测试:就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试。
-
原则:编写测试方法时,要尽可能覆盖业务方法中所有可能的情况(尤其是边界值)
-
JUnit:最流行的 Java 测试框架之一,提供了一些功能,方便程序进行单元测试(第三方公司提供)。
-
main方法测试:
-
测试代码与源代码未分开,难以维护
-
一个方法测试失败,一个像后面方法
-
无法自动化测试,得到测试报告
-
-
JUnit单元测试:测试类中方法的正确性
-
测试代码与源代码分开,便于维护
-
可以根据需要进行自动化测试
-
可自动分析测试结果,产出测试报告
-
案例
-
在pom.xml中,引入JUnit的依赖
-
在test/java目录下,创建测试类,并编写对应的测试方法,并在方法上生命 @test 注解。
-
运行单元测试(测试通过:绿色;测试失败:红色)。
注意:JUnit单元测试类命名规范为:XxxxxTest【规范】。JUnit单元测试的方法,必须声明为 public void 【规定】。
断言
-
断言:JUnit提供了一些辅助方法,用来帮我们确定被测试的方法是否按照预期的效果正常工作,这种方法称为断言。
-
为什么使用断言
-
单元测试方法运行不报错,不代表业务方法没问题。
-
通过断言可以检测方法运行结果是否和预期一致,从而判断业务方法的正确性。
-
断言方法 | 描述 |
---|---|
Assertions.assertEquals(Object exp, Object act,String msg) | 检查两个值是否相等,不相等就报错。 |
Assertions.assertNotEquals(Object unexp, Object act,String msg) | 检查两个值是否不相等,相等就报错。 |
Assertions.assertNull(Object act, String msg) | 检查对象是否为null,不为null,就报错。 |
Assertions.assertNotNull(Object act, String msg) | 检查对象是否不为null,为null,就报错。 |
Assertions.assertTrue(Boolean condition, String msg) | 检查条件是否为true,不为true,就报错。 |
Assertions.assertFalse(Boolean condition, String msg) | 检查条件是否为false,不为false,就报错。 |
Assertions.assertThrows(Class expType, Executable exec, String msg) | 检查程序运行抛出的异常,是否符合预期。 |
提示:上述方法形参中的最后一个参数msg,标识错误提示信息,可以不指定(有对应的重载方法)。
常见注释
-
在JUnit中还提供了一些注解,还增强其功能,常见注解有以下几个:
注解 | 说明 | 备注 |
---|---|---|
@Test | 测试类中的方法用它修饰才能成为测试方法,才能启动执行 | 单元测试 |
@ParameterizedTest | 参数化测试的注解(可以让单个测试运行多次,每次运行时仅参数不同) | 用了该注解,就不要@Test注解了 |
@ValueSource | 参数化的测试的参数来源,赋予测试方法参数 | 与参数测试注解配合使用 |
@DisplayName | 指定测试类、测试方法显示的名称(默认为类名、方法名) | |
@BeforeEach | 用来修饰一个实例方法,该方法会在每一个测试方法执行前执行一次 | 初始化资源(准备工作) |
@AfterEach | 用来修饰一个实例方法,该方法会在每一个测试方法执行后执行一次 | 释放资源(清理工作) |
@BeforeAll | 用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次 | 初始化资源(准备工作) |
@AfterAll | 用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次 | 释放资源(清理工作) |
依赖范围
-
依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope>...</scope>设置其作用范围。
-
作用范围:
-
主程序范围有效(main文件夹范围内)
-
测试程序范围有效(test文件夹范围内)
-
是否参与打包运行(package指令范围内)
-
-
scope值
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
---|---|---|---|---|
compile(默认) | y | y | y | log4j |
test | - | y | - | junit |
provided | y | y | - | servlet-api |
runtime | - | y | y | jdbc驱动 |