• Maven依赖管理


    ·先来一张本文章要介绍的内容的整体概述图,见上图

    • dependencies

      •   groupId:actifactId:version:classifier

        这个标签的各个子标签就是我们用来添加依赖用的。通常定位一个依赖就是通过groupId:actifactId: version:classifier来定位的,前三个大家都知道,最后一个classifier有可能会有一点陌生。正常情况下我们生成的依赖包其实就是通过groupId:actifactId: version来定位就足够了。但是有时我们会通过插件来生成自己构建(artifact)的附件,例如生成源代码版本的附件,或者生成文档附件。这时这些附件的名称一般都是groupId-actifactId-version-classifier的形式。例如

     这样的。这时,后面的sources其实就是classifier,如果我们需要引用这样的依赖就需要额外的指定classifier的标签。

      •   scope

        这个标签用来指定依赖的作用范围,他有六种选项

        • compile

             这种范围的依赖的包会一直跟随着项目的classpath,在编译、运行、测试、打包的时候会被一起打包进classpath,默认的依赖范围就是这种。

        • provided

            这种依赖范围在项目测试、运行的时候会被包含进classpath中一起运行,打包的时候并不会被以包含到classpath中一起 发布出去,这样的依赖范围表示期望运行时环境提供该依赖,典型的就是我们开发web时候需要的serlet-api,该依赖是在tomcat容器中就提供了,不再需要我们打包的时候一起打包进去。

        • runtime

            这种依赖范围在编译的时候不会被一起编译,其他时候会被使用到。在编译的时候不需要是因为我们在编码过程中并没有直接引用到这个包里面的内容,而是通过反射之类的动态加载的功能来使用到该包里面的内容。由此可知将runtime换成compile也不会出问题。但是设置成runtime就可以使你在编码过程中不会意外的直接引用到包里面的内容。

        • test

            这种依赖范围只有在测试的编译阶段和运行阶段起作用,在发布时不会被一起打包发布出去。

        • system

            这个依赖范围和provided很像,他也是期待运行时环境提供所需要的包。但是这个依赖的不同之处在于当你在pom.xml文件中引入这样的依赖时,他不会去你的repository中查找,他需要你指定systemPath来指定对应包的具体位置。

        • import 

            改标签只能在dependencyManagement标签中的dependency子标签中使用,他的作用在于将对应的依赖的dependencyManagement的内容添加到自己的dependencyManagement中来。

      •  type

          这个用来指定该构建的类型的,不填写默认为jar。如果依赖的构建为别的类型则必须填写真确,否则会引用到错误的依赖。

      • exclusions

          子标签时exclusion,可以通过grouip:actifactId来排除对应的传递依赖。

      •   optional

          也是一种类似于排查传递依赖的方式,若在A项目的pom.xml中指定一个依赖于B项目的dependency标签,若在dependency中加入optional=true。则当C项目依赖A项目时,正常情况下会传递依赖B项目,但是由于optional标签的影响,导致不会传递依赖B项目,只能显示指定传递依赖B。

    • 传递依赖

      接下来中,A->B,表示A依赖于B。若A->B, B->C,则A->C。称为传递依赖。传递依赖会影响到依赖之间的scope。下图为传递依赖scope影响图:

     第一列为直接依赖,第一行为传递依赖。第三行第三列交叉处举例。若A->B,其中B的scope为runtime。而B->C,C的scope为runtime。则A->C,传递依赖C对于A来说的其scope为runtime。第二行第四列交叉处举例。若A->B,其中B的scope为provided。而B->C,C的scope为test。则A不依赖于C。

    • dependencyManagement

      改标签其实为一种模板标签,在该标签中可以使用dependencies中的任何内容,他为dependencies提供了模板,它并不会真正的产生依赖,而当在dependencies指定标签时,标签会通过groupId:actifactId:type:classifier去dependencyManagement中查找有没有对应的模板,如果有,只会直接使用其模板,其中type默认为jar,classifier默认为null。所以我们可以通过groupIp:actifactId就可以定位到Management中的模板,一方面可以方便我们统一管理依赖,一方面可以省略一些配置。如果Management的模板并不适合,可以直接在dependency中指定自己需要的内容,dependency的优先级大于Management,Management的优先级大于继承过来的Management。该标签可以搭配import的scope来达到导入的目的。在使用import导入Management时要注意不要产生循环导入,即父pom导入子pom。

  • 相关阅读:
    WIDER Face 转为 COCO 格式标签
    latex转word
    No CUDA runtime is found, using CUDA_HOME='/usr/local/cuda'
    COCO数据集使用super categories时出现IndexError: list index out of range
    VS Code 中 torch has no xxx member
    Anaconda中安装Cascade RCNN(Detectron)的若干问题
    fatal error: nvcuvid.h: No such file
    hive一些语句
    端口号
    hadoop错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
  • 原文地址:https://www.cnblogs.com/huafengxiayun/p/12630045.html
Copyright © 2020-2023  润新知