zoukankan      html  css  js  c++  java
  • maven 依赖(依赖范围,聚合,继承等)

    目录:

    1.什么是依赖?

    2.依赖的管理:依赖的范围与传递,依赖的排除,依赖的原则(maven对依赖冲突的处理原则)

    3.依赖的版本管理

     4.继承与聚合

    1.什么是依赖?

    简单的讲,当jar包A需要jar包B的支持才能正常工作时,那么B就是A的依赖,以spring-core为例,它依赖commons-logging,再比如commons-fileupload,它依赖commons-io

    对于软件开发人员来说,手动拷贝jar包时常会碰到依赖关系的问题,特别是搭框架的时候,更是让人头大,不是缺这个就是少那个,因此我们需要一个工具帮助我们管理依赖

    关系,最好是我们导入一个jar包时,它可以自动帮我们处理相关的依赖包,maven就解决了这个问题,在maven中添加springcore的依赖,他会自动添加commons-logging

    可以看到添加依赖时需要提供依赖坐标,即G(域名倒序+项目名).A(模块名,也可以理解为工程名).V(版本),坐标的查询可以到maven的仓库:

    http://mvnrepository.com/(当然,以程序运行的角度来讲.依赖是对jar的引用)

    2.依赖的管理

    2.1依赖的范围

    依赖的范围可以理解为依赖的作用域,即依赖什么时候对什么有效

    依赖的范围有4种:compile,test.provided,runtime,重点关注我标红的两个,在<dependency>标签内部有一个<scope>标签

    此标签用于定义依赖的范围,其值默认为compile

    compile:对主程序以及test程序均有效,参与项目打包(即scope为complie的依赖所指向的jar包会在工程打包时(web工程)导入工程中)

    provided:对主程序以及test均有效,不参与打包(如servlet-api.jar,jsp-api.jar这些jar包会在容器中提供)

    test:仅对测试程序有效,也不参与打包(了解),

    runtime:仅参与打包,提供运行时支持(了解)

    2.2关于依赖传递

    如果模块A依赖了一些jar包,那么当我们创建模块B时,他需要依赖A,也就是说我们要在B的pom.xml中添加A的依赖(G.A.V)

    当我们添加A的依赖完毕后发现A依赖的jar也会被引入,这是对依赖最直接也是最简洁的解释,下面结合依赖范围对依赖的传递

    做个简短的说明,可以看到maven003工程依赖maven001工程

     在maven001工程中添加的jsp-api.jar的依赖scope为provided,可以看到maven003的依赖毫无变化

     修改scope为compile

     

     显然compile范围的依赖会进行传递,而provided范围的不会进行传递(test范围也不进行传递,这里不做演示了)但是当我们实际操作的时候,对于我们一些项目自带的依赖我们不想要或者不想使用

    这个版本,这个时候就涉及到依赖的排除与依赖的原则

    2.3依赖的排除

    使用<exclusions>标签对依赖进行排除(没有V),接着2.2我们把jsp-api.jar的依赖范围设为了compile但是作为maven003来讲,我不想要这个依赖,只需添加如下标签

    (ps:也可以在maven001 pom中借助optional标签来进行排除)

    2.4依赖的原则(maven对依赖冲突的处理)

    依赖的冲突通常都是跨pom文件冲突,对于这种冲突maven有两个原则.

    第一个原则是就近原则,现在我们让maven003的直接依赖是maven002.maven002的直接依赖是maven001.换句话说maven003的间接依赖是maven001

    如下所示,当log4j包出现冲突时,,maven003c采用了路径最近的maven002的版本

    第二个原则是先声明者优先,由于先声明了maven001的依赖,此时可以看到maven003采用了maven001中的log4j依赖版本

    当你把顺序调换后会发现,此时maven003采用了maven002的log4j依赖版本

    还有一种情况是同一个pom文件中,对同一个依赖使用了两个不同的版本,此时下面的覆盖上面的

    3.依赖版本统一管理

    jar包版本更迭速度快,如何对一个框架的相关jar进行统一的版本管理?

    maven提供了<properties>属性,在其内部自定义标签对版本进行控制,具体使用时在version中使用${}进行取值即可

    但是我们看到这只是在一个工程(模块)中实现了版本统一管理,如何在多个工程(模块)下实现版本统一呢?这就需要maven中的继承了

    4.继承与聚合

    创建一个maven工程Parent,注意把packaging选择为pom,接下来让已创建的的maven工程继承此工程,使用parent标签,添加父工程G.A.V即可

    这样就可以实现统一管理多个子工程的通用jar包,上面的图已经包含了聚合的信息

    聚合往往伴随着继承一起出现,为了方便多个子工程的"install"操作,使用聚合时需要在<modules>标签

    中指定各个模块或者子工程,这样直接在此父工程(聚合工程)上执行install操作,那么所有的子工程都会执行install

    操作了,值得一说的是如果你创建的是maven module(maven模块)那么你不需要使用继承就可以直接使用聚合,因为你创建

    mavenmodule时已经选择了parent project,这也是为什么生成的module中会有parent标签的原因,

    最后几点说明:

    1.由于依赖的scope默认是compile,所以依赖默认是传递的

    2.以上演示的jsp-api依赖实际开发时要注意把scope设为provided,否则容易引起jar包冲突 

    3.由上面的第四点可以得出结论:maven module与maven project的区别就是maven module必须有parent工程(现在还不清楚maven是如何对一个工程判断他是module还是projec)

  • 相关阅读:
    Python学习笔记21:数据库操作(sqlite3)
    JAVA的extends使用方法
    thinkphp5的Illegal string offset 'id'错误
    thinkphp5项目--个人博客(五)
    语法错误: unexpected ''); ?></span></span></h2> ' (T_CONSTANT_ENCAPSED_STRING), expecting ',' or ';'
    thinkphp5.0的验证码安装和相关错误
    thinkphp5项目--个人博客(四)
    thinkphp5项目--个人博客(三)
    NAS是什么
    百度编辑器简介及如何使用
  • 原文地址:https://www.cnblogs.com/tele-share/p/9307577.html
Copyright © 2011-2022 走看看