1. 父项目的dependencyManagement
最开始,知道dependencyManagement是管理jar包版本的,如果在父项目中的该节点下声明了包的版本,子项目中在Dependencies中引用该包时就不需要声明版本了,这样保证多个子项目能够使用相同的包版本。
dependencyManagement不实际下载jar包,只会声明包的版本。如果Dependencies中声明了包的版本,则会覆盖dependencyManagement声明的版本。
2. 解决包冲突
但是,除了上面简单理解的dependencyManagement,其实它更强大的功能是解决包冲突,很多教程也这么说,但是我一直以为是第一种情况那样,不用再声明包版本了,达到所有子项目包版本相同的目的,实际上,一个项目中,同时使用dependencyManagement和Dependencies,基本上就告别了使用exclusions一个一个排除包来解决包冲突的方法,这种方式以前并没有注意到,或者很多教程没有特别强调,但是这个才是dependencyManagement的方便之处。
起因是我使用如下jar包:
<properties>
<activitti.version>5.22.0</activitti.version>
<spring.redis.version>1.6.2.RELEASE</spring.redis.version>
<spring.vserion>4.1.5.RELEASE</spring.vserion>
</properties>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>${spring.redis.version}</version>
</dependency>
...
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activitti.version}</version>
</dependency>
其中,spring-data-redis引入spring版本是4.1.9, 而activiti-spring引入的spring版本是4.1.5.
如下图所示:
两者引入的spring组件的版本各部相同,导致程序无法运行,此时第一反应是使用exclusions一个个排除冲突的jar包,操作十分麻烦,突然想到dependencyManagement,如果我把冲突的包放在其中,声明了版本,会怎么样,如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.vserion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.vserion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.vserion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.vserion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.vserion}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>${spring.redis.version}</version>
</dependency>
...
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activitti.version}</version>
</dependency>
${spring.vserion}=4.1.5.RELEASE, 此时在dependencies之上,我添加了dependencyManagement,并且将所有冲突的jar包都声明了我想要的版本号,结果如下:
至此,可以告别exclusions了。