目录
1.3 dependencyManagement和dependencies的区别
1.标签
1.1dependencyManagement标签
简单的讲:该标签就是用于统一管理依赖。
这里有个比较特别的元素,即dependencyManagement元素。根据前面的简介可以知道它是依赖管理元素,也就是说,用来管理依赖的。因为在实际项目中它有特殊意义,而且能够被继承。
一个Maven项目要直接引用某个依赖,都是在dependencies中使用dependency描述要引用依赖的坐标信息来完成的。这样就达到了一个要什么,就直接写什么的效果,决定权都在是否用dependency指定了引用构件的坐标。但是在实际项目管理过程中可以有个全局的管理。也就是说,把整个项目要引用的依赖,事先分析整理好,形成一个全局的集合。当某个Maven模块需要具体引用某依赖的时候,直接在集合中指定若干个。这样就可以实现整个项目依赖的全局管理,不至于零碎地分布在每个Maven模块中。
基于这样的考虑,就可以在一个公共的pom.xml中使用dependencyManagement元素,将所有的依赖都声明管理好,如以下代码所示:
在项目中如果要使用前面在SpringPOM中用dependencyManagement管理的spring-core构件的话,只需继承SpringPOM,然后在用户自己的dependencies中指明spring-core就行,代码如下:
注意粗体部分,dependency中是没有指定version的,而且还不用配置scope,因为这些信息已经在SpringPOM中配置好了。这里只要通过groupId和artifactId指明是在dependencyManagement中配置的哪个,其他就自动明确了。虽然使用这种依赖管理机制不能减少太多的pom配置,不过还是建议用户使用这种方式。其原因是:在父pom中使用dependencyManagement声明依赖统一管理了项目中使用到的依赖种类、版本,每个子项目就不会出现额外的多余依赖,特别是没有优化的依赖和同一个构件的不同版本了。
1.2 dependencies标签
该标签中可以有多个<dependencie>标签,如下:
<dependencies>
<!-- spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
<!-- spring-cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
</dependency>
</dependencies>
每一个<dependencie>里面通过 gav这三个标签唯一确定一个依赖包。
1.3 dependencyManagement和dependencies的区别
区别1
<dependencyManagement>用于统一管理依赖,而不会直接下载依赖包,
在<dependencies>标签中的依赖会直接下载到本地。
简单一句话理解这两个标签的就是<dependencies>中的依赖maven会自动给我们下载,<dependencyManagement>中的依赖maven不会自动给我们下载。看图:
要想让maven给我们下载<dependencyManagement>中的依赖,怎么办。很简单,放在<dependencies>中就ok了:
如上图,fileupload包不用写版本号,因为已经通过dependencyManagement标签统一管理了。
区别2
如果在父类中定义了dependencies,子类继承的时候会自动产生依赖,
而dependencyManagement 中的东西就像是依赖的声明,子模块想要继承还需要在自己的pom文件中进行添加。
1.3.scope和type标签
使用<scope>import</scope>可以解决Maven项目单继承问题。
至于Maven项目继承问题,最好的例子的就是我们做springboot项目的时候的如下代码:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
如上,只能有一个parent,也就是只能继承一个父类。
我们知道Maven的继承和Java的继承一样,只能单继承,无法实现多继承,你是否想过我们如果要继承多个父模块的时候应该怎么做呢?或许你会想只往一个父模块中添加jar包依赖,只继承一个父模块就可以了,但是这样的话所有的jar包都混合在一起了,jar包分类就不在清晰了,其实我们可以用另外一种方式实现多模块继承,这个方法就是使用<type>pom</type><scope>import</scope>
,解释一下:type标签的默认值是jar,代表我们依赖导入的是一个jar包,现在我们设置成了pom,说明导入的是一个父模块,后面的scope标签中的值import代表把父模块中的jar包导入进来,不过需要注意的是<type>pom</type><scope>import</scope>
,这种方式只能用在<dependencyManagement></dependencyManagement>
中,那么再来一个例子吧,在SpringCloud项目中,我们导入SpringCloud依赖和SpringBoot依赖的代码如下:
<dependencyManagement>
<dependencies>
<!-- SpringCloud的jar包依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringBoot的jar包依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
上面的做法其实就相当于实现了多继承,毕竟我们导入了SpringCloud和SpringBoot的两个父模块的jar包依赖,而且还可以再写一个parent标签。
参考链接:
maven中dependencyManagement标签的简单使用(import scope依赖方式)_狂丰的博客-CSDN博客
Maven中pom文件内scope标签中import值的详解 - 之之小侠 - 博客园
使用<scope>import</scope>解决Maven项目单继承问题_明快de玄米61的博客-CSDN博客_import scope