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)

  • 相关阅读:
    vue form dynamic validator All In one
    TypeScript api response interface All In One
    closable VS closeable All In One
    macOS 如何开启 WiFi 热点 All In One
    vue css inline style All In One
    vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别 (下)
    牛腩新闻 59 整合添加新闻页 FreeTextBox 富文本编辑器,检测到有潜在危险的 Request.Form 值,DropDownList 的使用
    牛腩新闻 61尾声: error.aspx的使用 防止报错
    vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别 (上)
    牛腩新闻 62:尾声续2 asp.net的编译和发布
  • 原文地址:https://www.cnblogs.com/tele-share/p/9307577.html
Copyright © 2011-2022 走看看