Maven核心概念详解(依赖管理、依赖范围、maven仓库、插件)

maven的核心概念

一、不同依赖范围对传递依赖的影响

依赖范围(Scope)对于主代码classpath有效对于测试代码classpath有效被打包,对于运行时classpath有效例子
compileYYYlog4j
test-Y-junit
providedYY-servlet-api
runtime--YJDBC Driver Implementation

二、maven依赖配置

1.传递性依赖和可选依赖,排除依赖

依赖范围

依赖范围scope用于控制依赖和编译,测试,运行的classpath的关系,三者的关系如下:

  • compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
  • test:测试依赖范围。只对于测试classpath有效
  • provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
  • runtime:运行时的依赖范围,对于运行的classpath都有效。例如:jdbc驱动

maven坐标

例如

<dependencies>

        <!--在ebuy-2的项目中引用了ebuy-1-->
        <dependency>
            <groupId>cn.ebuy</groupId>
            <artifactId>ebuy-1</artifactId>
            <version>1.0-SNAPSHOT</version>

        </dependency>
    </dependencies>

测试

创建项目

  • 首先建设一个maven项目,建设结构如下

建设项目的方法

  • 建好之后的目录结构如下

在这里插入图片描述
引用项目

  • 然后在ebuy-1的项目下通过maven方式引入一个jar包
  • 然后在ebuy-2的项目下引入ebuy-项目,如图
    在这里插入图片描述

测试

  • 测试ebuy-1的项目对jar包设置不同scope,分别对ebuy-2的项目不同的影响

示例:

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
            <!--默认的范围-->
            <scope>compile</scope>
            <!--true表示引用该项目的子项目不能使用当前的JAR包-->
            <!--也就是说ebuy-2不能使用ebuy-1的这个jar包-->
            <optional>true</optional>
        </dependency>

完成以上设置之后测试

在这里插入图片描述

maven的依赖排除

用途1:
疑问:为什么要排除

我想在ebuy-2的项目下使用mysql5的驱动,但是我引用的ebuy-1使用的mysql8的驱动,如果我直接在ebuy-2的项目下,导入mysql5的jar包可能会报错之类的

如图
在这里插入图片描述
解决:
在这里插入图片描述

用途2:
提出疑问:我在ebuy-1项目下的log4j的jar包,不想让ebuy-1项目获取

回答一:那你直接设置这个jar包的optional设置为true不传递,不就行了吗!

疑问者:但是我想让ebuy-3能够获得这个jar包啊设置optional就是所有的项目都不能获取到了

那么该如何解决呢?

解决:

  • 在ebuy-2(不需要ebuy-1的jar的项目)的项目下添加排除
    在这里插入图片描述

总结:
作用:可以排除某些我们不需要的jar包

三、maven仓库

什么是maven仓库

  • 用于统一存储所有Maven共享构建的位置就是maven仓库

maven仓库布局

  • 根据Maven坐标定义每个构建在仓库中唯一存储路径

仓库的分类

  • 本地仓库
    • ~/.m2/repository/
    • 每个用户只有一个本地仓库
  • 远程仓库
    • 中央仓库:Maven:Maven默认的远程仓库
    • 私服:是一种特殊的远程仓库。它是架构在局域网内的仓库

四、Maven的插件

  • Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的
  • 每个插件都能实现多个功能,每个功能都是一个插件目标
  • Maven的生命周期与插件目标相互绑定,已完成某个具体的构建目标

例如complie就是插件 maven-complie-plugin的一个插件目标

posted @ 2021-04-09 11:07  小吕不秃顶也能变强  阅读(51)  评论(0)    收藏  举报