dependencyManagement标签
目的:统一依赖版本、分门别类管理依赖(通过下述的scope属性)
使用:
- 只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。
- 如果不在子项目中声明依赖,是不会从父项目中继承下来的,不过这段配置是会被继承
- 只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom
- 子项目会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。
- 另外如果子项目中指定了版本号,那么会使用子项目中指定的jar包版本。
```java
module1
支持scope属性为import:支持
<a name="gb882"></a>
## dependencies标签
目的:消除重复依赖<br />使用:即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。<br />是否支持scope属性为import:不支持
<a name="cA57S"></a>
##
<a name="hggHH"></a>
## scope属性
scope元素的作用:控制 dependency 元素的使用范围。通俗的讲,就是控制 Jar 包在哪些范围被加载和使用。具体取值参考[Maven依赖中scope的含义](https://www.jianshu.com/p/7145f01ac3ad),此处只讲取值为import时的作用。
- 出现的背景(针对import取值):
- Maven的继承和Java的继承一样,是无法实现多重继承的,即:一个子项目只能有一个父项目。
- 如果10个、20个甚至更多模块继承自同一个模块,假如将子模块需要的依赖加入父项目中,然后让子项目去显示声明继承父项目中的依赖,那么这个父模块的dependencyManagement会包含大量的依赖。如果你想把这些依赖分类以便于清晰的管理,那就不可能了,然而import scope依赖能解决这个问题。
- 解决办法:
- 首先为每一个子项目独立建立一个pom文件,其中用dependencyManagement专门用来管理该子项目的依赖。
例如可以写这样一个用于依赖管理的pom:
```java
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.sample</groupId>
<artifactId>base-parent1</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
<version>4.8.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
- 然后在父项目中通过import(非继承方式)引入各个子项目的pom文件,这样,父模块的pom就会非常干净,由专门的packaging为pom来管理依赖,也契合的面向对象设计中的单一职责原则。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.test.sample</groupId>
<artifactid>base-parent1</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 需要注意的点:import scope只能用在dependencyManagement里面。