参考文档1 参考文档2

dependencyManagement标签

目的:统一依赖版本、分门别类管理依赖(通过下述的scope属性)
使用:

  • 只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。
  • 如果不在子项目中声明依赖,是不会从父项目中继承下来的,不过这段配置是会被继承
  • 只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom
  • 子项目会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。
  • 另外如果子项目中指定了版本号,那么会使用子项目中指定的jar包版本。 ```java module1
3.1.1.RELEASE

org.springframework spring-web ${spring-version}

  1. 支持scope属性为import:支持
  2. <a name="gb882"></a>
  3. ## dependencies标签
  4. 目的:消除重复依赖<br />使用:即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。<br />是否支持scope属性为import:不支持
  5. <a name="cA57S"></a>
  6. ##
  7. <a name="hggHH"></a>
  8. ## scope属性
  9. scope元素的作用:控制 dependency 元素的使用范围。通俗的讲,就是控制 Jar 包在哪些范围被加载和使用。具体取值参考[Maven依赖中scope的含义](https://www.jianshu.com/p/7145f01ac3ad),此处只讲取值为import时的作用。
  10. - 出现的背景(针对import取值):
  11. - Maven的继承和Java的继承一样,是无法实现多重继承的,即:一个子项目只能有一个父项目。
  12. - 如果10个、20个甚至更多模块继承自同一个模块,假如将子模块需要的依赖加入父项目中,然后让子项目去显示声明继承父项目中的依赖,那么这个父模块的dependencyManagement会包含大量的依赖。如果你想把这些依赖分类以便于清晰的管理,那就不可能了,然而import scope依赖能解决这个问题。
  13. - 解决办法:
  14. - 首先为每一个子项目独立建立一个pom文件,其中用dependencyManagement专门用来管理该子项目的依赖。
  15. 例如可以写这样一个用于依赖管理的pom
  16. ```java
  17. <project>
  18. <modelVersion>4.0.0</modelVersion>
  19. <groupId>com.test.sample</groupId>
  20. <artifactId>base-parent1</artifactId>
  21. <packaging>pom</packaging>
  22. <version>1.0.0-SNAPSHOT</version>
  23. <dependencyManagement>
  24. <dependencies>
  25. <dependency>
  26. <groupId>junit</groupId>
  27. <artifactid>junit</artifactId>
  28. <version>4.8.2</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>log4j</groupId>
  32. <artifactid>log4j</artifactId>
  33. <version>1.2.16</version>
  34. </dependency>
  35. </dependencies>
  36. </dependencyManagement>
  37. </project>
  • 然后在父项目中通过import(非继承方式)引入各个子项目的pom文件,这样,父模块的pom就会非常干净,由专门的packaging为pom来管理依赖,也契合的面向对象设计中的单一职责原则。

pom
import 这两个标签一般成对出现。

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>com.test.sample</groupId>
  5. <artifactid>base-parent1</artifactId>
  6. <version>1.0.0-SNAPSHOT</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>
  • 需要注意的点:import scope只能用在dependencyManagement里面。