前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Maven – optional – exclusions – scope

Maven – optional – exclusions – scope

作者头像
收心
发布2023-05-18 09:38:26
5710
发布2023-05-18 09:38:26
举报
文章被收录于专栏:Java实战博客

Maven依赖传递冲突

路优优先

引用层级越短越有优先

项目A引入logback1.0与项目B,但是项目B引入项目C,项目C引入logback1.1。对于项目A自身的logback1.0来说,它是1级,项目C对于项目A来说它就是3级。所以项目使用logback1.0。

声明优先

当资源在相同层级被依赖时(白话就是子模块被引用时,就不是第一层级。)层级相同,上面配置覆盖下面的配置。

项目A引入项目B、项目C。项目B本身1级路径是logback1.1 、项目C本身1级路径也是logback1.2。如果项目A引入B、C的时候,项目B坐标写在项目C坐标上面,则项目B覆盖项目C的logback。项目使用logback1.1

特殊优先

当同级配置相同资源的多个版本,后配置覆盖前配置。

项目A引入logback1.1、logback1.2(直接引入了2个)。如果logback1.1写在logback1.2的上面,则后面版本覆盖前版本。项目使用logback1.2。

项目A引入logback1.0,项目B引入logback1.1,项目C引入logback1.2。

optional 可选依赖

可选依赖,不给引用者看到我使用了什么坐标。

比如项目A依赖了项目B,如果项目B使用了minio,同时标注了optional = true。则项目A看到项目B引用的内容了。

代码语言:javascript
复制
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.5.2</version>
            <optional>true</optional>
        </dependency>

exclusions 排除依赖

排除依赖:比如一个项目中有1个okhttp的依赖,引入一个minio,但是minio自己本身引入一个okhttp的依赖。如果我们不想让minio使用自己的okhttp,我们就可以使用exclusions 来排除minio自己的okhttp。

代码语言:javascript
复制
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.8.1</version>
        </dependency>

        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.5.2</version>
            <exclusions>
                <exclusion>
                    <groupId>com.squareup.okhttp3</groupId>
                    <artifactId>okhttp</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

scope 作用域

我们先了解一下Maven项目常见的配置吧

代码语言:javascript
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.10.0</version>
            <scope>compile</scope>
        </dependency>

仔细看看,上面Maven坐标,有一个scope标签。

我放上一张图片,IDEA集成的Maven的依赖项。

这是什么意思,有的没有?有的是runtime、test、compile。到底啥意思呢?

当我们在 Maven 中声明依赖项时,可以使用 <scope> 元素来指定依赖项的作用范围。作用范围决定了依赖项在哪些阶段需要被包含进来,以及在哪些阶段不需要被包含进来。

以下是 Maven 中常见的作用范围:

  • compile:默认作用范围,表示该依赖项在编译、测试和运行时都需要被包含进来。
  • provided:表示该依赖项在编译和测试时需要被包含进来,但在运行时不需要,因为它将由运行环境(Tomcat、Jetty等)提供。
  • runtime:表示该依赖项在编译时不需要被包含进来,但在运行时需要被加载。
  • test:表示该依赖项仅在测试时需要被包含进来,不会被打包到最终的构建文件中。
  • system:表示该依赖项类似于 provided,但需要从本地文件系统中指定路径加载。
  • import:表示该依赖项只在 <dependencyManagement> 中使用,用于管理依赖项的版本号,而不是实际引入依赖项。

通过使用不同的作用范围,我们可以更好地管理依赖项,并确保它们在正确的阶段被包含进来。

上文说了很多废话,并不能实际体现在开发中。

Maven scope标签最终体现在不同文件夹中生效:

  • main文件夹下
  • test文件夹下
  • package指令范围

test:仅仅作用在test文件夹下面的类中生效。比如:junit

compile:默认可省略。作用在整个Maven项目中。

runtime:仅仅作用于在package指令。比如:jdbc连接的信息等

provitred:除了package作用在其他范围内。比如:servlet-api。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Maven依赖传递冲突
    • 路优优先
      • 声明优先
        • 特殊优先
          • optional 可选依赖
            • exclusions 排除依赖
              • scope 作用域
              相关产品与服务
              腾讯云服务器利旧
              云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档