继续创作,加快生长!这是我参与「掘金日新方案 10 月更文应战」的第8天,点击检查活动概况

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的面板,你会发现:

Maven高级之依赖管理

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

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

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

Maven高级之依赖管理

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

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

Maven高级之依赖管理

在Dependencies中移除自己所添加maven_03_pojo依靠后,翻开BookServiceImpl的类,你会发现Book类依然存在,能够被正常运用

Maven高级之依赖管理
这个特性其实便是咱们要讲解的==依靠传递==。

依靠是具有传递性的:

Maven高级之依赖管理

阐明: 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>

Maven高级之依赖管理

经过比照,会发现一个结论

  • 特殊优先:当同级装备了相同资源的不同版别,后装备的掩盖先装备的。

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

  • 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面板中展现出来,展现的是哪个版别,也便是说它挑选的便是哪个版别,如:

Maven高级之依赖管理

假如想更全面的检查Maven中各个坐标的依靠关系,能够点击Maven面板中的show Dependencies

Maven高级之依赖管理
在这个视图中就能很明显的展现出jar包之间的相互依靠关系。

2.2 可选依靠和扫除依靠

依靠传递介绍完今后,咱们来思考一个问题,

Maven高级之依赖管理

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