依赖的传递性。

依赖的排除。

依赖的原则。

统一管理依赖的版本号。

1.依赖的传递性

  对于之前创建项目的依赖关系,如下:

  • Hello2依赖Hello

  • MakeFriends依赖Hello2,进而间接依赖Hello

  • 在Hello中添加下述依赖:
1
2
3
4
5
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
  • 则在Hello2和MakeFriends项目中也会自动添加Hello中上面的依赖:

maven_07_01

  • 可在pom.xml中查看依赖的信息:

maven_07_02

  依赖的传递性带来的好处:可以传递的依赖不必在每个模块工程中都重复声明,只需在“最底层的被依赖模块”的工程中依赖一次即可。

  在真实开发中,往往会专门设计一个模块,来处理相关的jar包的依赖信息。

注意:非compiler范围的依赖无法传递,若有需要就得重复声明。

  因而,可以这样认为,test和provided范围的依赖仅限于当前工程自己使用。


2.依赖的排除

1)需要设置依赖排除的场合

①假如传递过来的依赖中,有些 jar 包是不稳定版的,不希望加入当前工程。

②假如传递过来的依赖中,有些 jar 包是旧版本的,也不希望加入当前工程。

…还有其他场合

2)设置依赖的排除

  • 只需在要排除的工程的pom.xml中添加排除信息:
  • 注意:可在pom.xml的Dependency Hierarchy(依赖的层次结构)中的jar包上,右键单击再点击Open POM,就能查看jar包的POM信息。

maven_07_03

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependency>
<groupId>com.cwz.maven</groupId>
<artifactId>Hello2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<!--注意要在被依赖的工程信息中添加-->
<exclusions>
<exclusion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</exclusion>
</exclusions>
</dependency>

3.依赖的原则

  • 作用:解决模块工程之间的 jar 包冲突的问题(在依赖的传递性的基础上)。
  • ①验证路径最短者优先原则。如下图中的依赖关系,选择依赖路径最进的 jar 包:

maven_07_04

  • ②验证路径相同时先声明者优先。先声明Hello或Hello2工程的dependency,则优先。

maven_07_05


4.统一管理依赖的版本号

  • 【1】例如,下图中一个工程使用的spring 的 jar包都是4.0.0版本的。
  • 如果需要统一升级为4.1.1,怎么办呢?可以手动改,但太多,不可靠。

maven_07_06

  • 【2】建议使用的配置方式:
  • ①先在pom.xml的project节点中,声明properties标签,并在其内使用自定义标签统一声明版本号。如下:
1
2
3
<properties>
<cwz.spring.version>4.0.0.RELEASE</cwz.spring.version>
</properties>
  • ②在需要统一设置版本的位置,使用${自定义标签名}来引用声明的版本号。如下:
1
2
3
4
5
6
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${cwz.spring.version}</version>
<scope>compile</scope>
</dependency>
  • ③注意:properties标签配合自定义标签声明数据的配置,并不只是能用于声明依赖的版本号。凡是需要统一声明,再引用的场合都可以使用。
1
2
3
4
5
<properties>
<cwz.spring.version>4.0.0.RELEASE</cwz.spring.version>
<!--项目构建的源码的字符集:UTF-8-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

评论