Maven POM中的各种scope的行为总结

compile:默认的scope。任何定义在compile scope下的依赖将会在所有的class paths下可用。maven工程会将其打包到最终的artifact中。如果你构建一个WAR类型的artifact,那么在compile scope下引用的JAR文件将会被集成到WAR文件内。

provided:这个scope假定对应的依赖会由运行这个应用的JDK或者容器来提供。最好的例子就是servlet API。任何在provided scope下定义的依赖在构建时的类路径里是可用的,但是不会被打包到最终的artifact中。如果是一个WAR的文件,servlet API在构建时的类路径里是可用的,但是并不会被打包到WAR文件中。

runtime:在runtime scope下定义的依赖只会在运行期可用,而在构建期的类路径下不可用。这些依赖将会被打包到最终的artifact中。比如你有一个基于web的应用需要在运行时访问MySQL数据库。你的代码没有任何MySQL数据库驱动的硬依赖。你的代码仅仅是基于JDBC API来编写,在构建期并不需要MySQL数据库驱动。然而,在运行期,就需要相应的驱动来操作MySQL数据库了。因此,这个驱动应该被打包到最终的artifact中。

test:只用于测试变异的依赖(比如JUnit),execution必须定义在test scope下。这些依赖不会被打包到最终的artifact中。

system:于provided scope很像。唯一的区别在于,在system scope中,你需要告诉Maven如何去找到这个依赖。如果你要引用的依赖在Maven仓库中不存在时,就可以用这个scope。不推荐使用system依赖。

import:从其它的pom文件中导入依赖设置。
 ———————————————— 
版权声明:本文为CSDN博主「tinyid」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cnweike/article/details/52221410

依赖传递

  A依赖B,B依赖C,则A 默认是传递依赖C(我跟你混,你跟他混,那我默认也是跟他混),但前提是B对C的依赖是compile。A不想依赖C,则需要排除依赖。在<exclusions></exclusion>中配置;或者在<optional></optional>中配置。

  项目的这个位置可以查看本项目的依赖:

          

    如果项目A的pom里设置依赖B,项目B的pom里设置依赖C,项目A编译后,可以在此位置看到B和C(B和C是自己写的项目的话,首先要打包进本地仓库)。

 

 ps:

  如果依赖的是仓库里的jar,那首先去本地仓库里找,找不到就去中央仓库找,再找不到就报错。

  如果依赖的是自己的另一个项目,首先需要把自己的项目打包进本地仓库才行(项目运行Goals那里依次执行package命令和install命令)。要不是找不到的。

<exclusions>

  可以在A的pom里的对B的依赖部分添加<exclusions></exclusion>:

<dependency>

          B的坐标

          <exclusions>

            这里面写C的坐标。
              这里不能写版本,只写前面两个坐标。写版本报错。

          </exclusion>

      </dependency>

 

   这样,A在依赖B的同时,不继承B对C的依赖。

<optional>

  可以在B对C的依赖部分添加<optional>

<dependency>
 
           C的坐标
 
           <optional>true </optional>
 
       </dependency>

  这样的意思是,C只被B依赖,如果A依赖B,并不会被传递依赖C。<optional></optional>的默认值是FALSE,默认是继承依赖

  当然,如果A也想要依赖C,在自己的pom里声明对C的依赖就可以了。

 

继承:

A依赖B,B依赖C,B对C的依赖是compile,则A 默认是传递依赖C。如果不想看B和C是不是compile,那只要A是继承B,就自然接受B的所有依赖关系。

注意父工程B的打包方式要是pom。(Java工程是jar,web项目是war)

 

 

依赖冲突:

  是指有多条依赖传递到同一个jar,就需要确定到底是走哪一条依赖传递。有两个原则:短路径优先;先声明优先

  比如:

    A->B->C->X

    A->D-X

  此时默认是选路径最短的那一条。

  

  如果路径一样长的时候:

      1.同一个pom里,依赖同一个jar的不同版,是后面的覆盖前面的。(项目的pom里写了一个jar的不同版本的多个依赖)

      2.不同的pom里,也就是有传递:

           A->B->X

 

           A->D->X

        就选最先声明的。在A 的pom里,B和D谁的<dependency>写在前面,就选谁。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值