zoukankan      html  css  js  c++  java
  • Maven 依赖

    一. 依赖范围

    依赖范围是用来控制依赖与3种classpath(编译classpath,测试classpath,运行classpath)的关系。maven有以下几种依赖范围:

     

    1、compile 编译、测试、运行,A在编译时依赖B,并且在测试和运行时也依赖。

           strus-core、spring-beans

           打到war包或jar包。

    2、provided 编译、和测试有效,A在编译和测试时需要B。

           比如:servlet-api就是编译和测试有用,在运行时不用(tomcat容器已提供)。

           不会打到war。

    3、runtime:测试、运行有效。

           比如:jdbc驱动包 ,在开发代码中针对java的jdbc接口开发,编译不用。

           在运行和测试时需要通过jdbc驱动包(mysql驱动)连接数据库,需要的!!

           会打到war。

    4、test:只是测试有效,只在单元测试类中用。

           比如:junit

           不会打到war。

    如何设置依赖范围呢?

    比如我们要将mysql驱动的依赖设置为runtime范围,配置如下:

        <dependency>

           <groupId>mysql</groupId>

           <artifactId>mysql-connector-java</artifactId>

           <version>5.1.6</version>

           <scope>runtime</scope>

        </dependency>

    将servlet依赖设置为provided

        <dependency>

           <groupId>javax.servlet</groupId>

           <artifactId>servlet-api</artifactId>

           <version>2.5</version>

           <scope>provided</scope>

        </dependency>

    如果是compile就不需要设置了,因为compile是scope的默认值。关于test范围我们在后边讲解单元测试时再做演示。

    重新执行打包为war , 会发现servlet-api.jar已经不存在。

    二. 依赖传递

    什么是依赖传递?

    A->B(compile)     第一关系: a依赖b   compile

    B->C(compile)      第二关系: b依赖c   compile

    我们看下图:

     

    1、纵坐标:直接依赖

           A依赖B,B是A的直接依赖。

           在A的pom.xml中添加B的坐标。

    2、横坐标:传递依赖

           B依赖C,C是A的传递依赖。

    3、中间部分:传递依赖的范围,A依赖C的范围。

     

    三. 依赖调节原则(了解)

    情景再现:

    项目A依赖于项目B,项目B依赖于项目C(v1), 项目A依赖于项目D,项目D依赖于项目E,项目E依赖于C(v2),

    1、A--->B---->C(v1) ,    

    2、A------>D---->E----->C(v2)

    项目A隐形依赖了两个版本的C,那到底采用哪个版本呢?

    分析:

      依赖调解第一原则:路径优先,很明显,第一种路径深度是3,第二种路径深度是4,所以,maven会采用C(v1)

      依赖调解第二原则:声明优先,假设路径深度相等,那么声明在前的会被引用。

    四. 版本锁定

      在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。

           pom.xml文件中,jar的版本判断的两种途径

      1.如果dependencies里的dependency自己没有声明version元素,那么maven就会倒dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version。

      2.如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。

    五. 排除依赖

      我们仔细观察Maven Dependencies 下的jar包,会发现存在了两个javassist包,一个是 javassist-3.18.1-GA.  ,另一个是javassist-3.11.0-GA  。这是因为我们引入三大框架的jar包,hibernate依赖javassist-3.18.1-GA  ,而struts 依赖javassist-3.11.0-GA 。这就是我们通常所说的jar包版本冲突,如果这两个jar包同时存在,会导致后续某些操作会存在问题(比如openSessionInView失效),所以需要排除低版本的jar包。

    如何来排除依赖呢?添加下面红色字体的部分。作用是排除struts中依赖的javassist的jar

        <dependency>

           <groupId>org.apache.struts</groupId>

           <artifactId>struts2-core</artifactId>

           <version>2.3.24</version>

           <exclusions>

               <exclusion>

                  <groupId>javassist</groupId>

                  <artifactId>javassist</artifactId>

               </exclusion>

           </exclusions>

        </dependency>

    添加后发现javassist-3.11.0-GA消失。

  • 相关阅读:
    Entity Framework Core 2.0 新特性
    asp.net core部署时自定义监听端口,提高部署的灵活性
    asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法
    使用xshell连接服务器,数字键盘无法使用解决办法
    使用Jexus 5.8.2在Centos下部署运行Asp.net core
    【DevOps】DevOps成功的八大炫酷工具
    【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别
    【Network】UDP 大包怎么发? MTU怎么设置?
    【Network】高性能 UDP 应该怎么做?
    【Network】golang 容器项目 flannel/UDP相关资料
  • 原文地址:https://www.cnblogs.com/jingjiren/p/13290755.html
Copyright © 2011-2022 走看看