史上最全Maven教程(三)

news/2024/4/24 10:03:24/文章来源:https://blog.csdn.net/Wwd631255/article/details/130384950

文章目录

    • 🔥Maven工程测试_Junit使用步骤
    • 🔥Maven工程测试_Junit结果判定
    • 🔥Maven工程测试_@Before、@After
    • 🔥依赖冲突调解_最短路径优先原则
    • 🔥依赖冲突调解_最先声明原则
    • 🔥依赖冲突调解_排除依赖、锁定版本

🔥Maven工程测试_Junit使用步骤

在这里插入图片描述
在Maven项目中引入依赖

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>

定义被测试的类

我们定义一个计算器工具类。

public class Calculator {// 加法public int add(int a,int b){return a+b;}// 除法public int div(int a,int b){return a/b;}
}

对定义的类进行测试

⭐ 创建src/test/java包,并将改包设置为测试包。
⭐ 在src/test/java中创建测试类的包,包名一般与被测试包名一致。
⭐ 定义测试类,类名一般为被测试类+Test
在这里插入图片描述

⭐ 测试类中编写测试方法。

public class CalculatorTest {/*** 测试方法是可以独立运行的,写法如下:* 1.方法名一般为test+被测试方法名* 2.方法上方添加@Test* 3.测试方法没有参数和返回值*/@Testpublic void testAdd(){Calculator calculator = new Calculator();int add = calculator.add(1, 2);System.out.println(add);}@Testpublic void testDiv(){Calculator calculator = new
Calculator();int div = calculator.div(2,0);System.out.println(div);}
}

🔥Maven工程测试_Junit结果判定

在这里插入图片描述

点击测试方法边的三角运行测试方法,如果出现绿色对钩,证明方法能正常运行;如果出现红色感叹号,证明方法抛出异常,需要修改方法。
在这里插入图片描述

当然,不是能正常运行就代表方法一定没有问题,也有可能方法的结果和预期结果不一致,这时就需要使用断言操作。

@Test
public void testAdd(){Calculator calculator = new
Calculator();int add = calculator.add(1, 2);/*** 断言* 参数1:预期结果,参数2:实际结果*/Assert.assertEquals(2,add);}

如果真实结果和预期结果不一致,则会抛出以下异常:
在这里插入图片描述

🔥Maven工程测试_@Before、@After

在这里插入图片描述

在测试类中,@Before 修饰的方法会在测试方法之前自动执行,@After 修饰的方法会在测试方法执行之后自动执行。我们可以设置前置方法为获取资源,后置方法为释放资源。

@Before
public void before(){System.out.println("开始测试");
}
@After
public void after(){System.out.println("结束测试");
}

🔥依赖冲突调解_最短路径优先原则

在这里插入图片描述

依赖冲突产生的原因——依赖传递

假设你的项目依赖jar包A,jar包A又依赖jar包B。当添加jar包A时,Maven会把jar包B也自动加入到项目中。比如刚刚我们添加了 junit 依赖,junit 又依赖hamcrest,所以Maven会将junit和hamcrest都加入项目中。
在这里插入图片描述

这时就可能会产生依赖冲突问题,比如依赖A会引入依赖C,依赖B也会引入依赖C。如果不进行调解则会引入两个依赖C,那么Maven是如何解决依赖冲突问题的呢?
在这里插入图片描述

依赖冲突调解

我们以Spring依赖为例,spring-webmvc依赖spring-aop,spring-context也依赖spring-aop,如果两个同时引入,会引入哪个版本的spring-aop呢?

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.12.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.2.4.RELEASE</version>
</dependency>

Maven调解依赖冲突的第一原则是最短路径优先原则:

也就是说项目依赖关系树中路径最短的版本会被使用。例如,假设有几个jar包之间的依赖关系是: A->B->C->D(2.0)E->F->D(1.0) ,如果同时引入A和E,那么D(1.0)会被使用,因为E到D的路径更短。

查看依赖路径的方式如下:
在这里插入图片描述

spring-webmvc到spring-aop的路径如下:
在这里插入图片描述

spring-context到spring-aop的路径如下:
在这里插入图片描述

可以看到,spring-webmvc 到spring-aop 的路径为:

 spring-webmvc -> spring-context -> spring-aop

而spring-context到spring-aop的路径为:

spring-context -> spring-aop

spring-context到spring-aop的路径更短,所以spring-aop会按照spring-context的版本引入。
在这里插入图片描述

🔥依赖冲突调解_最先声明原则

在这里插入图片描述

最短路径优先原则不能解决所有问题,比如这样的依赖关系: A–>B–>C(1.0)D–>E–>C(2.0) ,同时引入A和D之后,C(1.0)和C(2.0)的依赖路径长度都为2。此时第一原则将不能解决问题

Maven调解依赖冲突的第二原则是最先声明原则:
在依赖路径长度相等的前提下,在POM中依赖声明的顺序靠前的会被解析使用。比如:以上案例中,spring-webmvc和spring-context到spring-core的路径都为1。谁声明在上方,spring-core会按照谁的版本引入。
在这里插入图片描述
在这里插入图片描述

🔥依赖冲突调解_排除依赖、锁定版本

在这里插入图片描述

如果不想使用Maven默认的冲突调解方式,有两种方式可以手动进行冲突调解。

排除依赖

比如以上案例中,想使用spring-webmvc的spring-aop包,那么可以让spring-context引入时排除引入spring-aop包,这样就可以使用spring-webmvc的spring-aop包了,写法如下

<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.2.4.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.12.RELEASE</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></exclusion></exclusions>
</dependency>

锁定版本

在Maven中为某个jar包配置锁定版本后,不考虑依赖的声明顺序和依赖路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。以下可以直接配置spring-aop锁定的版本。

<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>springaop</artifactId><version>4.2.4.RELEASE</version></dependency></dependencies>
</dependencyManagement>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103912.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty源码解读

Netty源码解读 Netty线程模型 1、定义了两组线程池BossGroup和WorkerGroup&#xff0c;BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写 2、BossGroup和WorkerGroup类型都是NioEventLoopGroup&#xff0c;Group中维护了多个事件循环线程NioEventLoop&#…

案例3:Java汽车保养维修系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

linux系统防火墙开启放行其他端口

linux系统防火墙开启放行其他端口 弹性云主机防火墙放行对应端口 1、WDCP 系统端口放行&#xff1a; &#xff08;1&#xff09;3.2版本 登录wdcp面板后点击“安全管理”——“防火墙设置”——“快速添加”&#xff0c;如图填写端口&#xff08;协议默认都使用tcp&#xf…

【Linux基本指令和权限(1)】

本文思维导图&#xff1a; 文章目录 一、Linux操作的特点二、使用指令从Xhell登录云服务器三、基本指令1.ls指令2. pwd指令&#xff1a;3.cd指令4. touch指令5. rm指令 写在最后 Linux是一个操作系统&#xff0c;操作系统是一款做软硬件管理的软件。 一、Linux操作的特点 Li…

transformer 网络概述

1. RNN存在的问题 RNN对并行计算并不友好&#xff0c;下一输出依赖于上一输入&#xff0c;难以实现并行高效计算RNN相比较与self-attension模块&#xff0c;缺少对部分变量权重的预估&#xff0c;输出的数据默认拥有一致的权重 2. self-attension self-attension是干嘛的&am…

2023年商票研究报告

第一章 行业概况 1.1 定义 商票是指出票人依托商业汇票系统&#xff0c;以数据电文形式制作的&#xff0c;委托付款人在指定日期无条件支付确定的金额给收款人或者持票人的票据。按承兑人的不同&#xff0c;商业汇票分为银行承兑汇票和商业承兑汇票&#xff08;即商票&#x…

Linux进程(1)

目录 ⛹&#x1f3fd;进程简介⛹&#x1f3fd;查看进程⛹&#x1f3fd;系统调用&#x1f6b4;&#x1f3fd;获取进程标示符&#x1f6b4;&#x1f3fd;创建进程 ⛹&#x1f3fd;进程状态&#x1f6b4;&#x1f3fd;孤儿进程&#xff1a;&#x1f6b4;&#x1f3fd;进程优先级 ⛹…

新一代边缘计算盒子,英码科技边缘计算盒子SY-E160

SY-E160 是英码科技推出的新一代智能工作站&#xff0c;内部集成了 4 核强悍处理器 A551.5 GHz&#xff0c;其内置的算力核拥有 16Tops 超强算力。SY-E160 工作站采用低功耗技术设计&#xff0c;支持 宽温度环境工作&#xff0c;可以灵活部署于各种 AI 场景中。 SY-E160 深元 A…

每日一个小技巧:1招教你提取伴奏怎么做

伴奏是指在演唱或演奏时&#xff0c;用来衬托或补充主唱或乐器的音乐声音。而伴奏提取是一种技术&#xff0c;它可以帮助我们从歌曲中将人声和乐器分离出来。当我们听到一些喜欢的歌曲时&#xff0c;往往会被它的旋律深深吸引&#xff0c;想要将其作为自己的演唱曲目&#xff0…

Domino的线程ID和操作系统的进程ID对应关系

大家好&#xff0c;才是真的好。 很多时候&#xff0c;在Domino中运行的任务出现一些错误提示&#xff0c;如果能够准确定位到和提示信息相关任务时&#xff0c;对我们排错有着巨大的帮助&#xff0c;也能节省很多时间。 例如&#xff0c;我们可能在Domino实时控制台上看到以…

InstructGPT原理讲解及ChatGPT类开源项目

InstructGPT原理讲解及ChatGPT类开源项目 Generative Pre-Trained Transformer&#xff08;GPT&#xff09; 是OpenAI的提出的生成式预训练语言模型&#xff0c;目前已经发布了GPT-1、GPT-2、GPT-3和GPT-4&#xff0c;未来也将发布GPT-5。 最近非常火的ChatGPT是基于Instruct…

想提高应用程序的用户满意度——APK体积包优化少不了

作者&#xff1a;子不语Any 前言 减少应用程序安装包的大小&#xff0c;不仅仅减少用户的网络数据流量&#xff0c;还减少了下载等待的时间。毋庸置疑&#xff0c;尽量减少程序安装包的大小是十分有必要的。 通常来说&#xff0c;减少程序安装包的大小有两条规律&#xff1a;…

Java_常用API

Java_常用API ​ API即Application Programming Interface&#xff0c;即应用程序接口。一般来说API就是软件组件之间信息交互的桥梁&#xff0c;通过它无需访问源码。API除了有应用程序接口的含义外&#xff0c;还特质API的说明文档&#xff0c;也称为帮助文档。 1.字符串的…

Linux服务使用宝塔面板搭建网站,并发布公网访问 - 内网穿透(1)

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 转载自远程内网穿透的文章&#xff1a;Linux使用宝塔面板搭建网站&#xff0c;并内网穿透实现公网访问 前言 宝塔面板作为简单好用的服务器运维管理面板&#…

读书笔记---植物基因组学(樊龙江主编)

读书笔记---植物基因组学&#xff08;樊龙江主编&#xff09; 最近看了这本书&#xff0c;作者是樊龙江教授&#xff08;浙江大学&#xff09;&#xff0c;里面主要分为两个大部分&#xff1a; 总论&#xff1a;15章 各论&#xff1a;10章详细目录可以参看下面链接&#xff1a…

MySQL中使用批量插入,但需要校验每条数据是否重复且是否已经存在数据库中

问题 批量插入一组数据&#xff0c;数据库中name和age字段组合起来不能有重复&#xff0c;如果出现重复&#xff0c;则直接跳过不插入。 name和age字段组合起来不重复&#xff0c;要求如下&#xff1a; 解决方法 建立name和age的复合索引&#xff0c;并设置为唯一索引 场景…

数列分段 马蹄集

数列分段 难度&#xff1a;黄金 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;128M 对于给定的一个长度为N的正整数数列A,,现要将其分成连续的若干段&#xff0c; 并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足 要求。 格式 输入格式&#xff1a;第一行包含…

基于Java开发的分布式在线教育系统,支持考试、直播、问答

一、开源项目简介 知道学习平台是一个基于 Java 开发的分布式在线教育系统项目采用前后端分离的企业级微服务架构引入组件化的思想实现高内聚低耦合&#xff0c;项目代码简洁注释丰富上手容易注重代码规范&#xff0c;严格控制包依赖可以帮助个人、企业或机构快速搭建一个在线…

刷爆朋友圈!前百度总裁陆奇最新AI重磅演讲:我的大模型世界观

文 / 高扬 陆奇的演讲刷屏了&#xff0c;我认真看了他的演讲稿&#xff0c;收获颇丰。 陆奇提到&#xff0c;人类社会的发展&#xff0c;大致可分为&#xff1a;农业化、工业化和数字化三个阶段。 在三个递进的阶段中&#xff0c;人类一直在探索如何减少烦琐且消耗能量的体力和…

案例1:Java超市管理系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…