使用Maven依赖的范围/作用域可以变相引入多个父级依赖

依赖的基本元素

一个dependency的声明可以包含以下元素:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.kafka</groupId>
  4. <artifactId>kafka-clients</artifactId>
  5. <version>0.8.2.2</version>
  6. <scope>compile</scope>
  7. <optional>false</optional> 可选依赖就是optional标签,默认false。
  8. 排除依赖
  9. <exclusions>
  10. <exclusion>
  11. <groupId>org.apache.zookeeper</groupId>
  12. <artifactId>zookeeper</artifactId>
  13. </exclusion>
  14. </exclusions>
  15. </dependency>
  16. </dependencies>
  • groupId+artifactId+version构成了依赖的基本坐标,Maven根据坐标才能找到依赖。
  • scope定义了依赖的范围,默认是compile。
  • optional定义了是否为可选依赖,默认是false。
  • exclusion用来排除传递性依赖。

范围或作用域

  • compile:编译依赖范围,使用此依赖范围对于编译、测试、运行三种classpath都有效,即在编译、测试和运行时都要使用该依赖jar包;
  • test:测试依赖范围,只对测试有效,表明只在测试的时候需要,在编译和运行时将无法使用该类依赖,如 junit;
  • provided:已提供依赖范围。编译和测试有效,运行无效。如servlet-api,在项目运行时,tomcat等容器已经提供,无需Maven重复引入;
  • runtime:运行时依赖范围。测试和运行有效,编译无效。如 jdbc 驱动实现,编译时只需接口,测试或运行时才需要具体的 jdbc 驱动实现;
  • system:系统依赖范围,使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径,不依赖Maven仓库解析,所以可能会造成建构的不可移植,谨慎使用。
  • import: 等同于parent标签,在parent被占用时,引入父依赖用
    示例,spring cloud的依赖就这样引入,因为父依赖已经被占用
  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.1.9.RELEASE</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. /省略其他配置......
  8. <dependencyManagement>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-dependencies</artifactId>
  13. <version>${spring-cloud.version}</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. </dependencies>
  18. </dependencyManagement>

排查Maven父类的部分依赖

同理,如果你想集成某个Maven父依赖,父依赖中有很多默认依赖,你想排查一部分父类的依赖只继承一部分。可以使用作用域这个方式。import然后部分依赖即可