• 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消失。

  • 相关阅读:
    不要胡思乱想
    天天被思想教育
    带金属牙套
    要清楚自己的弱点
    打碎自己,理解自己,重塑自己
    我的侄子
    Proj CMI Paper Reading: Developing Trustworthy Hardware with SecurityDriven Design and Verification
    Proj CMI Paper Reading: Expanding the Reach of Fuzz Testing
    Proj CMI Paper Reading: Defect Prediction Guided SearchBased Software Testing
    Proj CMI Paper Reading: Detect Vulnerabilities Utilizing Fuzzing
  • 原文地址:https://www.cnblogs.com/jingjiren/p/13290755.html
Copyright © 2020-2023  润新知