Maven高级(二)

简介: Maven高级

2,依赖管理


我们现在已经能把项目拆分成一个个独立的模块,当在其他项目中想要使用独立出来的这些模块,只需要在其pom.xml使用标签来进行jar包的引入即可。


其实就是依赖,关于依赖管理里面都涉及哪些内容,我们就一个个来学习下:


  • 依赖传递
  • 可选依赖
  • 排除依赖


我们先来说说什么是依赖:


依赖指当前项目运行所需的jar,一个项目可以设置多个依赖。


格式为:


 

<!--设置当前项目所依赖的所有jar-->
<dependencies>
    <!--设置具体的依赖-->
    <dependency>
        <!--依赖所属群组id-->
        <groupId>org.springframework</groupId>
        <!--依赖所属项目id-->
        <artifactId>spring-webmvc</artifactId>
        <!--依赖版本号-->
        <version>5.2.10.RELEASE</version>
    </dependency>
</dependencies>

 


2.1 依赖传递与冲突问题


回到我们刚才的项目案例中,打开Maven的面板,你会发现:


1.png


在项目所依赖的这些jar包中,有一个比较大的区别就是有的依赖前面有箭头>,有的依赖前面没有。


那么这个箭头所代表的含义是什么?


打开前面的箭头,你会发现这个jar包下面还包含有其他的jar包


1.png


你会发现有两个maven_03_pojo的依赖被加载到Dependencies中,那么maven_04_dao中的maven_03_pojo能不能使用呢?


要想验证非常简单,只需要把maven_02_ssm项目中pom.xml关于maven_03_pojo的依赖注释或删除掉


1.png


在Dependencies中移除自己所添加maven_03_pojo依赖后,打开BookServiceImpl的类,你会发现Book类依然存在,可以被正常使用


1.png


这个特性其实就是我们要讲解的依赖传递


依赖是具有传递性的:


1.png


说明:A代表自己的项目;B,C,D,E,F,G代表的是项目所依赖的jar包;D1和D2 E1和E2代表是相同jar包的不同版本


(1) A依赖了B和C,B和C有分别依赖了其他jar包,所以在A项目中就可以使用上面所有jar包,这就是所说的依赖传递


(2) 依赖传递有直接依赖和间接依赖


  • 相对于A来说,A直接依赖B和C,间接依赖了D1,E1,G,F,D2和E2
  • 相对于B来说,B直接依赖了D1和E1,间接依赖了G
  • 直接依赖和间接依赖是一个相对的概念


(3)因为有依赖传递的存在,就会导致jar包在依赖的过程中出现冲突问题,具体什么是冲突?Maven是如何解决冲突的?


这里所说的依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。


情况一: 在maven_02_ssm的pom.xml中添加两个不同版本的Junit依赖:


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

1.png

通过对比,会发现一个结论


  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。


情况二: 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高


  • A通过B间接依赖到E1
  • A通过C间接依赖到E2
  • A就会间接依赖到E1和E2,Maven会按照层级来选择,E1是2度,E2是3度,所以最终会选择E1


情况三: 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的


  • A通过B间接依赖到D1
  • A通过C间接依赖到D2
  • D1和D2都是两度,这个时候就不能按照层级来选择,需要按照声明来,谁先声明用谁,也就是说B在C之前声明,这个时候使用的是D1,反之则为D2


但是对应上面这些结果,大家不需要刻意去记它。因为不管Maven怎么选,最终的结果都会在Maven的Dependencies面板中展示出来,展示的是哪个版本,也就是说它选择的就是哪个版本,如:


1.png


如果想更全面的查看Maven中各个坐标的依赖关系,可以点击Maven面板中的show Dependencies


1.png


在这个视图中就能很明显的展示出jar包之间的相互依赖关系。


2.2 可选依赖和排除依赖


依赖传递介绍完以后,我们来思考一个问题,


1.png


  • maven_02_ssm 依赖了 maven_04_dao
  • maven_04_dao 依赖了 maven_03_pojo
  • 因为现在有依赖传递,所以maven_02_ssm能够使用到maven_03_pojo的内容
  • 如果说现在不想让maven_02_ssm依赖到maven_03_pojo,有哪些解决方案?


说明:在真实使用的过程中,maven_02_ssm中是需要用到maven_03_pojo的,我们这里只是用这个例子描述我们的需求。因为有时候,maven_04_dao出于某些因素的考虑,就是不想让别人使用自己所依赖的maven_03_pojo。


方案一:可选依赖


  • 可选依赖指对外隐藏当前所依赖的资源---不透明


maven_04_dao的pom.xml,在引入maven_03_pojo的时候,添加optional


 

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>maven_03_pojo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递-->
    <optional>true</optional>
</dependency>

此时BookServiceImpl就已经报错了,说明由于maven_04_dao将maven_03_pojo设置成可选依赖,导致maven_02_ssm无法引用到maven_03_pojo中的内容,导致Book类找不到。


1.png


方案二:排除依赖


  • 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本---不需要


前面我们已经通过可选依赖实现了阻断maven_03_pojo的依赖传递,对于排除依赖,则指的是已经有依赖的事实,也就是说maven_02_ssm项目中已经通过依赖传递用到了maven_03_pojo,此时我们需要做的是将其进行排除,所以接下来需要修改maven_02_ssm的pom.xml


 

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>maven_04_dao</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--排除依赖是隐藏当前资源对应的依赖关系-->
    <exclusions>
        <exclusion>
            <groupId>com.itheima</groupId>
            <artifactId>maven_03_pojo</artifactId>
        </exclusion>
    </exclusions>
</dependency>


这样操作后,BookServiceImpl中的Book类一样也会报错。


当然exclusions标签带s说明我们是可以依次排除多个依赖到的jar包,比如maven_04_dao中有依赖junit和mybatis,我们也可以一并将其排除。

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>maven_04_dao</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--排除依赖是隐藏当前资源对应的依赖关系-->
    <exclusions>
        <exclusion>
            <groupId>com.itheima</groupId>
            <artifactId>maven_03_pojo</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </exclusion>
    </exclusions>
</dependency>


介绍我这两种方式后,简单来梳理下,就是


  • A依赖B,B依赖C,C通过依赖传递会被A使用到,现在要想办法让A不去依赖C
  • 可选依赖是在B上设置,A不知道有C的存在,
  • 排除依赖是在A上设置,A知道有C的存在,主动将其排除掉。


3,聚合和继承


我们的项目已经从以前的单模块,变成了现在的多模块开发。项目一旦变成了多模块开发以后,就会引发一些问题,在这一节中我们主要会学习两个内容聚合继承,用这两个知识来解决下分模块后的一些问题。


3.1 聚合


1.png


  • 分模块开发后,需要将这四个项目都安装到本地仓库,目前我们只能通过项目Maven面板的install来安装,并且需要安装四个,如果我们的项目足够多,那么一个个安装起来还是比较麻烦的
  • 如果四个项目都已经安装成功,当ssm_pojo发生变化后,我们就得将ssm_pojo重新安装到maven仓库,但是为了确保我们对ssm_pojo的修改不会影响到其他项目模块,我们需要对所有的模块进行重新编译,那又需要将所有的模块再来一遍


项目少的话还好,但是如果项目多的话,一个个操作项目就容易出现漏掉或重复操作的问题,所以我们就想能不能抽取一个项目,把所有的项目管理起来,以后我们要想操作这些项目,只需要操作这一个项目,其他所有的项目都走一样的流程,这个不就很省事省力。


这就用到了我们接下来要讲解的聚合


  • 所谓聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合
  • 聚合工程:通常是一个不具有业务功能的"空"工程(有且仅有一个pom文件)
  • 作用:使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建
  • 当工程中某个模块发生更新(变更)时,必须保障工程中与已更新模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题。


关于聚合具体的实现步骤为:


步骤1:创建一个空的maven项目


1.png


步骤2:将项目的打包方式改为pom

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <groupId>com.itheima</groupId>
    <artifactId>maven_01_parent</artifactId>
    <version>1.0-RELEASE</version>
    <packaging>pom</packaging>
</project>


说明:项目的打包方式,我们接触到的有三种,分别是


  • jar:默认情况,说明该项目为java项目
  • war:说明该项目为web项目
  • pom:说明该项目为聚合或继承(后面会讲)项目


目录
相关文章
|
6月前
|
Java Maven Spring
Maven高级-属性配置使用、资源文件引用属性及版本管理
Maven高级-属性配置使用、资源文件引用属性及版本管理
160 0
|
6月前
|
Java Maven Spring
Maven高级-继承、实施步骤及聚合与继承的区别
Maven高级-继承、实施步骤及聚合与继承的区别
71 0
|
6月前
|
Java Maven
Maven高级-分模块开发和设计及依赖管理
Maven高级-分模块开发和设计及依赖管理
74 0
|
6月前
|
存储 Oracle Java
Maven高级-私服简介与安装及私服仓库分类
Maven高级-私服简介与安装及私服仓库分类
125 0
|
6月前
|
Java 关系型数据库 MySQL
Maven高级
Maven高级
47 0
|
6月前
|
Java Maven 开发者
Maven高级-聚合与继承 私服(图文并茂)
Maven高级-聚合与继承 私服(图文并茂)
65 0
|
6月前
|
Java Maven 数据安全/隐私保护
Maven高级-本地仓库访问私服配置及私服资源上传与下载
Maven高级-本地仓库访问私服配置及私服资源上传与下载
1171 0
|
6月前
|
Java 测试技术 Maven
Maven高级-多环境配置与应用及跳过测试方式
Maven高级-多环境配置与应用及跳过测试方式
87 0
|
6月前
|
Java Maven
Maven高级-聚合及实施步骤
Maven高级-聚合及实施步骤
68 0
|
存储 Java 程序员
【Maven基础篇-黑马程序员】Maven项目管理从基础到高级,一次搞定!
依赖范围传递性 带有依赖范围的资源在进行传递时,作用范围将受到影响
87 0

推荐镜像

更多
下一篇
无影云桌面