maven--pom.xml--<scope>为import的作用

本文详细介绍了 Maven 中 `<scope>` 标签为 `import` 的含义及其用法。`<scope>import</scope>` 仅在 `<dependencyManagement>` 中用于类型为 `pom` 的依赖,它会将指定 POM 文件中的 `<dependencyManagement>` 部分的依赖引入到当前项目。这样可以解决 Maven 的单继承问题,允许同时继承多个父 POM。示例中展示了如何通过 `import` 解决 Spring Boot 和 Spring Cloud 依赖管理的冲突问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文网址: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中做如下操作:

  1. 指定parent为spring-boot-starter-parent
  2. 在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引入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT利刃出鞘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值