Day15-03.maven高级-继承与聚合-版本锁定
(1)版本锁定
分模块之后我们一个项目可能拆分成好几个模块,各个模块所共有的这部分依赖我们就可以直接定义在父工程中,子工程继承了父工程之后,这部分依赖就可以全部继承下来。然后还有一部分依赖并不是各个模块共有的,只是部分模块需要,此时我们就需要在各个模块中单独来配置了。
比如我们项目拆分成了这样几个模块,其中web-management,web-system,web-report这几个模块需要用到JWT的依赖,那我们就需要在各个模块中分别来引入JWT的依赖。既然是统一的项目,各个模块中依赖的版本是不是应该保持一致?便于项目的统一管理和维护,比如我们当前使用的版本是0.9.1,将来假如我要升级JWT的版本,要修改为0.9.2应该怎么做?我们就得找到当前项目的所有模块,一个一个的去查看所有的pom文件,看一下用到JWT的以阿里没有,如果用到了,就将他修改为0.9.2。如果项目的模块拆分的比较多,很有可能遗漏到一两个模块,导致这两个模块的版本还是0.9.1这个版本。所以会发现,我们模块拆分的越多,依赖的版本号越不好管理。在Maven项目中,我们到底应该如何来统一管理各个依赖的版本呢?此时就可以使用Maven给我们提供的版本锁定功能。
1、在maven中,可以在父工程的pom文件中通过dependencyManagement来统一管理依赖版本
在Maven当中,我们可以在父工程中通过dependencymanagement来统一管理依赖的版本。需要注意的是,我们使用**dependencymanagement这个标签,它仅仅代表的是我们要统一管理这个依赖的版本,他并不会直接把这项依赖引入进来。如果我们在子工程中要用到JWT这项依赖,我们还需要通过dependenct这个标签手动引入,只不过此时子工程在引入这项依赖的时候,就不需要再通过version这个标签指定版本号了,**因为子工程继承了父工程,父工程中已经指定了JWT的版本了。所以子工程引入的依赖版本,就是父工程中统一管理的这个版本号。如果此时要修改依赖的版本号,就无需再子工程做任何操作,只需要在父工程中统一修改即可,这就被称为版本锁定。
2、子工程引入依赖后,无需指定version版本号,父工程统一管理。变更依赖版本,只需要在父工程中统一变更。
(2)演示
(3)自定义属性/引用属性
我们可以在pom文件的properties标签中自定义标签,用它来表示版本号,用到的地方直接引用这个标签。
为什么spring-boot-starter-web在parent中没有指定版本,子工程也不用指定版本呢?
因为parent还有一个父工程spring-boot-starter-parent,而spring-boot-starter-parent还有一个父工程spring-boot-dependencies,这个spring-boot-dependencies里面维护了很多版本信息,其中就包括spring-boot-starter-web。
(4)小结
1、dependenctManagement与dependencies的区别是什么?
①:dependencie是直接依赖,在父工程配置了依赖,子工程会直接继承下来
②:dependencyManagement是统一管理依赖版本,不会直接依赖,还需要在子工程中引入所需要的依赖(无需指定版本)