原文网址:maven--pom.xml--<scope>为import的作用_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍maven中<scope>的值为import时的含义。
<scope>import</scope>
用法说明
import这个<scope>只能用在dependencyManagement里面,且仅用于<type>为pom的<dependency>。
它的作用就是引入了某个pom文件。被标记为scope=import的这个<dependency>会被替换为一系列的<dependency>。
因为它们是被替换的,所以这些scope=import的<dependency>不会遵循依赖继承。
官网解释:
This scope is only supported on a dependency of type pom in the <dependencyManagement> section. It indicates the dependency is to be replaced with the effective list of dependencies in the specified POM's <dependencyManagement> section. Since they are replaced, dependencies with a scope of import do not actually participate in limiting the transitivity of a dependency.
技术资料与交流 ==> 分享靠谱资料:Java真实面试题汇总、简历模板、PDF书籍、PPT模板等;分享Java实用技术;帮助优化简历。详见:资料与交流
示例
项目A和项目B的pom.xml文件中都定义了<dependencyManagement>,同时在B的<dependencyManagement>中定义<dependency>指向A,且<scope>为import:
project-B的pom.xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>project-A</groupId>
<artifactId>project-A</artifactId>
<version>1.0</version>
<scope>import</scope>
</dependency>
...
</dependencies>
</dependencyManagement>
这就相当于项目B将项目A中定义的所有<dependencies>全部复制粘贴到了项目B的pom.xml中。由于是“复制粘贴”,所以没有继承关系。
项目实例
Maven是单继承机制,也就是parent标签只能有一个。而POM文件的parent标签一般是继承spring-boot-starter-parent。如果想继承其他的父类(比如:spring-cloud-dependencies)怎么办?
import这个scope可以解决这个单继承的问题。
解决方案如下:
在项目中的pom.xml中做如下操作:
- 指定parent为spring-boot-starter-parent
- 在dependencyManagement中指定Spring Cloud依赖,scope设置为import
自己的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.knife</groupId>
<artifactId>router4j-client-feign-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>router4j-client-feign-boot-starter</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
</dependencies>
</project>
Spring Cloud的pom.xml
spring-cloud-dependencies-2020.0.1.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies-parent</artifactId>
<version>3.0.1</version>
<relativePath></relativePath>
</parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.1</version>
<packaging>pom</packaging>
<name>spring-cloud-dependencies</name>
<description>Spring Cloud Dependencies</description>
<properties>
<!-- 忽略其他 -->
<spring-cloud-openfeign.version>3.0.1</spring-cloud-openfeign.version>
<spring-cloud-gateway.version>3.0.1</spring-cloud-gateway.version>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
<dependencyManagement>
<dependencies>
<!-- 忽略其他 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-dependencies</artifactId>
<version>${spring-cloud-openfeign.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gateway-dependencies</artifactId>
<version>${spring-cloud-gateway.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
import用法总结
情景1:解决单继承问题
通过import pom文件达到依赖的目的(典型的非继承模式),从而不用从父类中引用依赖
情景2:单一职责原则
根据依赖的分类,细化每个单一职责的pom.xml文件。可以将不同种类的依赖放到不同pom.xml,然后通过<scope> import引入