maven

maven 依赖声明的三要素 坐标

     groupId、artifactId、version 

     声明了三要素,一个坐标唯一定位了一个依赖的某个版本的jar包,maven会自动到远程的中央仓库里面去,下载到本地来,在打包的时候,就会自动使用,编译

 

依赖范围

<scope></scope>

maven 有三套classpath,classpath就是项目中用到的各种依赖的类,jvm在运行的时候需要去classpath下面加载对应的类

maven 在编译源码的时候有一条classpath;在编译测试代码以及执行测试代码的时候,有一套classpath;运行项目的时候,有一套classpath;依赖范围就是用来控制依赖包与这三种classpath的关系的。

compile: 默认,对编译、测试、运行的classpath都有效。一般都是用这种的scope

test: 仅仅对于编译和运行测试代码的classpath有效,编译或者运行主代码的时候无效,仅仅测试代码需要用的依赖一般都会设置这个范围。比如junit。一些测试框架,或者只有在测试代码中会使用的一些依赖,会设置为test,这个的好处在于说,打包的时候这种test scope是不会放到最终的发布包里的

provided: 编译和测试的时候有效,但是在运行的时候无效,因为可能环境已经提供了,比如servlet-api,一般就是这个范围,在运行的时候,servlet容器会提供依赖。servlet-api是用来开发java web项目的,可能你在开发代码和执行单元测试的时候,需要在pom.xml里面声明这个servlet-api依赖,因为要写代码和测试代码。但是最终打包完成之后,放到tomcat容器里面去跑的时候,是不需要将这个servlet-api依赖包打入发布包中的,因为tomcat容器本身就会给你提供servlet-api的包

runtime: 测试和运行classpath有效,但是编译代码时无效,比如jdbc的驱动实现类,比如mysql驱动。因为写代码的时候是基于javax.sql包下的标准接口去写代码的。然后在测试的时候需要这个包,在实际运行的时候才需要这个包的,但是编译的时候只要javax.sql接口就可以了,不需要mysql驱动类,一般我们声明mysql驱动的时候不会设置runtime

传递依赖性

   maven 传递性依赖,就是说会自动递归解析所有的依赖,然后负责将依赖下载下来,接着所有层级的依赖,都会成为我们的项目的依赖,不需要我们手工干预。传递性依赖机制对依赖范围也是有影响的。

       

    比如说,我们依赖于A,是compile;A依赖于B,是test;我们对B的依赖范围是空,就是我们不会去依赖B,因为你自己想想知道,A只有在测试的时候才会使用B。我们依赖A是生产用的,我们依赖B干嘛?

依赖调解

    既然maven会自动解析所有层级的依赖,给我们自动下载所有依赖,但是可能会出现依赖冲突的问题

    比如A->B->C->X(1.0),A->D->X(2.0),此时就会依赖调解,就近原则,离A最近的选用,就是X的2.0版本

    如果路径等长,那么会选择第一声明原则,哪个依赖在pom.xml先声明,就选择哪个

可用依赖 

<optional>true</optional>  此时依赖传递失效,不会向上传递

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值