2022年0902Maven的依赖学习<第四课>

news/2024/5/19 11:18:23/文章来源:https://blog.csdn.net/qq_56248592/article/details/126669488
本博客学习的目标图

 

目录

第一部分 Maven的依赖的学习内容介绍

第一点  依赖的范围

1 依赖范围 Scope

2 一张表告诉你Scope的范围介绍

3 总结:

4 观察

5 测试

①验证 compile 范围对 main 目录有效

②验证test范围对main目录无效

③验证test和provided范围不参与服务器部署

④验证provided范围对测试程序有效

第二点  依赖的传递性

1  看下面的图来观察

2 概念

3 测试的方式 一

4 测试方式二

5 测试方式 三

第三点  依赖的排除性

1 当 A 依赖 B,B 依赖 C 而且 C 可以传递到 A 的时候,A 不想要 C,需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免 jar 包之间的冲突。

 3 分析  在一个工程中有以下操作   在A工程开始执行流程是要经历过 红色 绿色 蓝色 三个模块中  在这三个模块是相互依赖的关系执行流程如下

A工程——>x-3.0——>service-api-2.0——>B工程

在执行的流程中你发现有些文件有所冲突 想将一些文件舍弃去 不要 该如何操作呢?

4  所以配置依赖的排除其实就是阻止某些 jar 包的传递。因为这样的 jar 包传递过来会和其他 jar 包冲突。

5 配置

6 测试

7 运行 mvn dependency:tree 命令查看效果:

发现在 spring-core 下面就没有 commons-logging 了。

第四部分 聚合

1 理解这张图

 2  Maven 中的聚合

总工程

3 聚合的配置

4 依赖循环问题

第一部分 Maven的依赖的学习内容介绍

第一点  依赖的范围

1 依赖范围 Scope

标签的位置:dependencies/dependency/scope

标签的可选值:compile/test/provided/system/runtime/import

2 一张表告诉你Scope的范围介绍

main目录(空间)test目录(空间)开发过程(时间)部署到服务器(时间)
compile有效有效有效有效
test无效有效有效无效
provided有效有效有效无效

3 总结:

copile:通常使用的第三方框架的 jar 包这样在项目实际运行时真正要用到的 jar 包都是以 compile 范围进行依赖的。比如 SSM 框架所需jar包。**

test:测试过程中使用的 jar 包,以 test 范围依赖进来。比如 junit。

provided:在开发过程中需要用到的“服务器上的 jar 包”通常以 provided 范围依赖进来。比如 servlet-api、jsp-api。而这个范围的 jar 包之所以不参与部署、不放进 war 包,就是避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担。说白了就是:“服务器上已经有了,你就别带啦!”

4 观察

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Maven的坐标  -->
<groupId>com.web.maven</groupId>
<artifactId>pros-web01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--   -->
<!-- 打包的方式是War包  -->
<packaging>war</packaging>
<name>pros-web01-maven Maven Webapp</name>
<!--  FIXME change it to the project's website  -->
<url>http://www.example.com</url>
<!-- 源码的字符集  -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--  配置对Java工程maventest的依赖  -->
<!--  具体的配置方式:在dependency标签内使用坐标实现依赖  -->
<dependency>
<groupId>com.efg.maven</groupId>
<artifactId>maventest</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>pros-web01-maven</finalName>
<pluginManagement>
<!--  lock down plugins versions to avoid using Maven defaults (may be moved to parent pom)  -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!--  see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging  -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

5 测试

 

 

 

 

 

①验证 compile 范围对 main 目录有效

main目录下的类:HelloServlet 使用compile范围导入的依赖:pro01-java-maven

验证:使用compile范围导入的依赖对main目录下的类来说是有效的

有效:HelloServlet 能够使用 pro01-java-maven 工程中的 Calculator 类

验证方式:在 HelloServlet 类中导入 Calculator 类,然后编译就说明有效。

②验证test范围对main目录无效

测试方式:在主体程序中导入org.junit.Test这个注解,然后执行编译。

具体操作:在pro01-maven-java\src\main\java\com\csdn\maven目录下修改Calculator.java

执行Maven编译命令: mvn compile

[ERROR] /D:/maven-workspace/space201026/pro01-maven-java/src/main/java/com/atguigu/maven/Calculator.java:[3,17] 程序包org.junit不存在

③验证test和provided范围不参与服务器部署

其实就是验证:通过compile范围依赖的jar包会放入war包,通过test范围依赖的jar包不会放入war包。

④验证provided范围对测试程序有效

测试方式是在pro02-maven-web的测试程序中加入servlet-api.jar包中的类。

第二点  依赖的传递性

1  看下面的图来观察

 

2 概念

在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。

B 依赖 C 时使用 compile 范围:可以传递 B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。 使用 compile 范围依赖 spring-core

3 测试的方式 一

在pro-java-maven工程依赖 spring-core(之前我们创建的一个Maven的Java项目)

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.0.0.RELEASE</version>
</dependency>

使用 mvn dependency:tree 命令查看效果:  使用 mvn dependency:list 命令查看效果:

TIP[INFO] com.csdn.maven:pro01-maven-java:jar:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.12:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] \- commons-logging:commons-logging:jar:1.1.1:compile

4 测试方式二

还可以在 Web 工程中,使用 mvn dependency:tree 命令查看效果(需要重新将 :maventest 安装到仓库而且之前的文章中我们已经设置过Maven的web工程依赖Java工程)

IP[INFO] com.csdn.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.12:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] \- commons-logging:commons-logging:jar:1.1.1:compile

5 测试方式 三

验证 test 和 provided 范围不能传递

从上面的例子已经能够看到 pro01-java-maven依赖了 junit,但是在 pro02-maven-web 工程中查看依赖树的时候并没有看到 junit。

要验证 provided 范围不能传递,可以在 pro01-maven-java 工程中加入 servlet-api 的依赖。

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>
TIP[INFO] com.web.maven:pro02-maven-web:war:1.0-SNAPSHOT[INFO] +- junit:junit:jar:4.12:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] \- commons-logging:commons-logging:jar:1.1.1:compile

第三点  依赖的排除性

1 当 A 依赖 B,B 依赖 C 而且 C 可以传递到 A 的时候,A 不想要 C,需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免 jar 包之间的冲突。

2 观察下面的图找答案

 

 3 分析  在一个工程中有以下操作   在A工程开始执行流程是要经历过 红色 绿色 蓝色 三个模块中  在这三个模块是相互依赖的关系执行流程如下

A工程——>x-3.0——>service-api-2.0——>B工程

在执行的流程中你发现有些文件有所冲突 想将一些文件舍弃去 不要 该如何操作呢?

所以配置依赖的排除其实就是阻止某些 jar 包的传递。因为这样的 jar 包传递过来会和其他 jar 包冲突。

5 配置

<dependency><groupId>com.csdn.maven</groupId><artifactId>pro01-maven-java</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope><!-- 使用excludes标签配置依赖的排除    --><exclusions><!-- 在exclude标签中配置一个具体的排除 --><exclusion><!-- 指定要排除的依赖的坐标(不需要写version) --><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions>
</dependency>

6 测试

测试的方式:在 pro02-maven-web 工程中配置对 commons-logging 的排除

<dependency><groupId>com.csdn.maven</groupId><artifactId>pro01-maven-java</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope><!-- 使用excludes标签配置依赖的排除    --><exclusions><!-- 在exclude标签中配置一个具体的排除 --><exclusion><!-- 指定要排除的依赖的坐标(不需要写version) --><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions>
</dependency>

7 运行 mvn dependency:tree 命令查看效果:

TIP[INFO] com.csdn.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.12:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile

发现在 spring-core 下面就没有 commons-logging 了。

 

第四部分 聚合

1 理解这张图

 

 

 2  Maven 中的聚合

使用一个“总工程”将各个“模块工程”汇集起来,作为一个整体对应完整的项目。

项目:整体 模块:部分

TIP

概念的对应关系:

从继承关系角度来看:

父工程 子工程 从聚合关系角度来看:

总工程

模块工程 好处 一键执行 Maven 命令:很多构建命令都可以在“总工程”中一键执行。

以 mvn install 命令为例:Maven 要求有父工程时先安装父工程;有依赖的工程时,先安装被依赖的工程。我们自己考虑这些规则会很麻烦。但是工程聚合之后,在总工程执行 mvn install 可以一键完成安装,而且会自动按照正确的顺序执行。

配置聚合之后,各个模块工程会在总工程中展示一个列表,让项目中的各个模块一目了然。

3 聚合的配置

在总工程中配置 modules 即可

<modules>  <module>pro04-maven-module</module><module>pro05-maven-module</module><module>pro06-maven-module</module></modules>

4 依赖循环问题

如果 A 工程依赖 B 工程,B 工程依赖 C 工程,C 工程又反过来依赖 A 工程,那么在执行构建操作时会报下面的错误:

DANGER

[ERROR] [ERROR] The projects in the reactor contain a cyclic reference: 这个错误的含义是:循环引用。

 

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

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

相关文章

这份 Github 下载量高达 76.9W 次的《Java 系列面试宝典》,足以吊打各个大厂面试官

前言: 之前有看过很多的 Java 知识点资料&#xff0c;但是很多资料都是零零散散的并且不全面&#xff0c;像这样一整份 PDF 文档&#xff0c;分知识点整理好的资料并不多了&#xff0c;所以我觉得我是捡到宝了&#xff0c;所以特意分享给大家&#xff0c;需要的人可以自取&…

基数排序(学习)

一、基数排序描述 基数排序(radix sort)属于分配式排序,又被称为桶子法,它是通过键值的各个位的值,将要排序的元素分配至某些桶中,达到排序的作用基数排序法属于稳定的排序,基数排序法的是效率高的稳定性排序法基数排序是桶排序的扩展 二、基数排序描述 将所有待比较数值统一为…

Vulnhub靶场 ICA: 1

环境准备 靶机地址&#xff1a;ICA: 1 ~ VulnHub 漏洞复现 arp-scan -l IP信息收集 nmap进行IP服务扫描&#xff0c;发现开放80&#xff0c;22&#xff0c;3306端口 访问80端口&#xff0c;可以看到是qdPM 9.2的框架 kali进行漏洞搜索&#xff0c;发现存在 查看该文件的目录…

电子学会2022年6月青少年软件编程(图形化)等级考试试卷(一级)

青少年软件编程青少年软件编程&#xff08;图形化&#xff09;一级 一、单选题(共25题&#xff0c;共50分) 广场中有声控喷泉&#xff0c;当声音的音量大于60的时候&#xff0c;喷泉就会喷出水&#xff0c;现在的音量为30&#xff0c;下列哪个选项可以让喷泉喷出水&#xff1f;…

【Vue 基础知识】keep-alive是什么?怎么用?

提示&#xff1a;前端查漏补缺&#xff0c;仅代表个人观点&#xff0c;不接受任何批评 文章目录一、keep-alive是什么&#xff1f;二、使用步骤1. 基本使用2. 允许组件有条件地缓存3. 缓存组件实例数量限制三、注意事项提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

【编程题】【Scratch四级】2021.06 从小到大排序

从小到大排序 小猴子询问输入5个数&#xff0c;存入列表后&#xff0c;将这些数字从小到大排列后重新存入列表。 1. 准备工作 &#xff08;1&#xff09;保留舞台默认白色背景&#xff1b; &#xff08;2&#xff09;删除小猫角色&#xff0c;添加Monkey角色。 2. 功能实现…

新库上线 | CnOpenData房地产业工商注册企业基本信息数据

房地产业工商注册企业基本信息数据 一、数据简介 房地产业是指&#xff1a;以土地和建筑物为经营对象&#xff0c;从事房地产开发、建设、经营、管理以及维修、装饰和服务的集多种经济活动为一体的综合性产业&#xff0c;是具有先导性、基础性、带动性和风险性的产业。 房地产…

SpringBoot_11_整合MyBatis

SpringBoot_11_整合MyBatis整合MyBatis整合测试整合MyBatis 官方文档&#xff1a;http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ Maven仓库地址&#xff1a;https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-…

Vue——整理一些开源管理平台项目

【VUE2】 vue-element-admin Git代码仓库&#xff1a;https://github.com/PanJiaChen/vue-element-admin.git Gitee代码仓库&#xff1a;https://gitee.com/wry-vue-demo/vue-element-admin-wry &#xff08;不定期同步&#xff09; 官方文档&#xff1a;https://panjiachen.g…

优雅的实现EasyPoi动态导出列的两种方式

文章目录前言一、基于Excel的 isColumnHidden 属性1.1 实现原理1.2 实现步骤1.3 实现效果二. 基于List< ExcelExportEntity > 的导出2.1 实现效果总结前言 嗨&#xff0c;大家好&#xff0c;我是希留。 项目里使用的是EasyPoi来处理导入导出功能的。近日因业务需求调整…

基于springboot+vue的游戏交流论坛系统 elementui

随着时代的发展&#xff0c;人们对手机和电脑的依赖越来越严重。很多时候人们会在下班之后或者下课之后和寝室以及朋友们来一盘游戏。以度过这些空闲时间。但是对于更多的人来说&#xff0c;他们可能是在孤军奋战&#xff0c;并没有更多的朋友和同学去进行交流&#xff0c;这个…

【目标检测算法】YOLO-V1~V3原理梳理

文章目录one-stage 与 tow-stage评价指标YOLO算法整体思路解读YOLO-V1YOLO-V2YOLO-V3one-stage 与 tow-stage 本篇博客主要介绍经典检测方法中的one-stage&#xff08;单阶段&#xff09;&#xff0c;在这里给自己埋个坑&#xff0c;整理完Yolo再去搞tow-stage。 one-stage:tow…

x64dbg 插件开发环境配置

x64dbg 是一款开源的应用层反汇编调试器,旨在对没有源代码的可执行文件进行恶意软件分析和逆向工程,同时 x64dbg 还允许用户开发插件来扩展功能,插件开发环境的配置非常简单,如下将简单介绍x64dbg是如何配置开发环境以及如何开发插件的。x64dbg 是一款开源的应用层反汇编调…

计算机网络——传输层の选择题整理

传输层提供的服务 1、可靠传输协议中&#xff0c;可靠指的是&#xff08;&#xff09; A、使用面向连接的会话 B、使用尽力而为的传输 C、使用滑动窗口来维持可靠性 D、使用确认机制来确保传输的数据不丢失 解析&#xff1a;选D 对于A&#xff0c;使用面向连接的会话&#xff…

hadoop学习使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、hadoop的作用&#xff1f; hadoop是什么&#xff1f;hadoop能做什么&#xff1f;搭建HadoopHA高可用集群 1普通集群配置文件2 高可用集群配置 整理和记录搭建…

Hadoop伪分布式搭建

搭建环境&#xff1a; centos6.5 vm16 jdk1.8 hadoop 2.6.5 1.先设置静态ip vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICEeth0 #HWADDR00:0C:29:42:15:C2 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOstatic IPADDR192.168.90.11 NETMASK255.255.255.0 GA…

单分散亚微米聚苯乙烯—聚乙酸乙烯酯(P(St-VAc))聚合物微球/聚苯乙烯塑料微球聚乙烯醇相关知识

单分散亚微米聚苯乙烯—聚乙酸乙烯酯(P(St-VAc))聚合物微球相关研究&#xff1a; 互贯聚合物网络( the interpenetrating polymernetworks,简称IPNs)是由两种或两种以上的交联聚合物互相贯穿而形成的一种聚合物合金体系["。由于形成IPNs时两网之间的互贯和缠结&#xff0…

阿里巴巴按关键字搜索商品 API 返回值说明

请求参数 请求参数&#xff1a;q眼镜&start_price0&end_price0&page1&cat0&discount_only&sort&page_size40&seller_infono&nick&seller_info&nick&ppath&imgid&filter 参数说明&#xff1a;q:搜索关键字 cat:分类I…

天花板级别的python读取文件方法,真的香.......

嗨害大家好鸭&#xff01; 我是小熊猫❤ 咱今天来了解一下 fileinput 说到fileinput&#xff0c;可能90%的码农表示没用过&#xff0c;甚至没有听说过。 这不奇怪&#xff0c;因为在python界&#xff0c;既然open可以走天下&#xff0c;何必要fileinput呢&#xff1f; 但是…

Dubbo线程池

前言 Dubbo使用Netty作为网络调用框架&#xff0c;Netty是一个Reactor模型的框架&#xff0c;线程模型分为boss线程池和worker线程池&#xff0c;boss线程池负责监听、分配事件&#xff0c;worker线程池负责处理事件&#xff0c;简单说就是boss线程池负责hold请求&#xff0c;并…