当前位置: 首页 > news >正文

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

f55d6ac4dc1d4485a78427e8cb7f0c41.png

本博客学习的目标图

 

目录

第一部分 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>

b9b8dfa70d214a72b53fa77a97eb5be2.png

5 测试

2005fc7ac3c64132a4309c7259c95201.png

 

5eb4b16f628e43c5a34c0f24d4bbb4cc.png

 817d8d8769a4418590be41136ebf4c44.png

51fca38c7edd431ba275b339300e6105.png

 

b6fbc64dcc0f4aab862dfcd6ae9aa009.png

 

 

①验证 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  看下面的图来观察

7afc1886efc04cc791ac5bb4149eb21e.png

 

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 观察下面的图找答案

f97fd0121ce84f59a9bf58300a2aeaf3.png

 

c5ec5fe3e06844e79244672d19ed25e5.png

 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 了。

b3211ad4d91e48d8833df95b0e9a7982.png

 

第四部分 聚合

1 理解这张图

ca7084e71fa442d3bd59bbbc6bb53968.png

3ce4d673102f4810be2686536b699c6e.png

 

 

eafaadbef2c446cd9a733f7abb767d3b.png

 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: 这个错误的含义是:循环引用。

a94385f51f434d1e837b9902ca74fc23.png

 

 

 

 

 

相关文章:

  • Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)
  • Vue模板语法(01)
  • 世界第一台通用计算机:ENIAC
  • JAVA学习----HashSet类
  • 文章组合生成-免费文章组合生成软件
  • 华为面试应该怎么准备?
  • JDBC如何记忆
  • C语言之预处理
  • Flutter 系列---入门篇
  • 全球与中国汽车多楔带行业发展趋向分析及投资前景预测报告2022-2028年
  • Java IO流详解
  • 迷宫_Sarsa算法_边做边学深度强化学习:PyTorch程序设计实践(2)
  • iOS视频捕获入门篇
  • 数据可视化系列教程|六大组件基础知识
  • 《MySQL技术内幕:InnoDB存储引擎》学习笔记-第二章
  • SegmentFault for Android 3.0 发布
  • #Java异常处理
  • .pyc 想到的一些问题
  • @jsonView过滤属性
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • HTML中设置input等文本框为不可操作
  • opencv python Meanshift 和 Camshift
  • ReactNative开发常用的三方模块
  • spring boot下thymeleaf全局静态变量配置
  • 订阅Forge Viewer所有的事件
  • 对象引论
  • 浅谈Golang中select的用法
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序:实现悬浮返回和分享按钮
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #HarmonyOS:Web组件的使用
  • (2)(2.10) LTM telemetry
  • (第二周)效能测试
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (五)c52学习之旅-静态数码管
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .java 9 找不到符号_java找不到符号
  • .Net CF下精确的计时器
  • .net访问oracle数据库性能问题
  • .NET基础篇——反射的奥妙
  • .NET微信公众号开发-2.0创建自定义菜单
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /usr/bin/env: node: No such file or directory
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [Angular 基础] - 表单:响应式表单
  • [Bada开发]初步入口函数介绍
  • [DAX] MAX函数 | MAXX函数
  • [Django 0-1] Core.Handlers 模块