• 5.1 Maven坐标——项目唯一标识

      • groupId(必须定义):定义Mavan项目隶属的实际项目,如SpringFramework,一个实际项目可包含多个Maven项目
      • artifactId(必须定义):定义实际项目中的一个Maven项目,如spring-core、spring-context
      • version(必须定义):定义Maven项目模块的版本
      • packaging(可选,默认为jar):定义Maven项目的打包方式,如jar,war。
      • classifier(不能直接定义):定义构建输出的一些附属构件,如xxx-2.0-javadoc.jar、xxx-2.0-sources.jar等附属构件。注意,不能直接显示定义,因为附属构件是由附加的插件生成的
      • 项目文件名一般为artifactId-version[-classifier].packaging,[-classifier]表示可选
    • 5.2依赖的配置
      • 依赖声明可包含如下的元素:

      • groupId、artifactId和version:基本坐标,大部分依赖声明只包含基本坐标
      • type:依赖的类型,对应项目坐标中的pacaging,大部分情况下,不必声明,默认为jar
      • scope:依赖的范围
      • optional:依赖是否可选
      • exclusions:用来排除传递性依赖
    • 5.5依赖范围
      • 3种classpath

        • 编译classpath:编译项目主代码的时候使用
        • 测试classpath:编译项目测试代码和执行测试的时候使用
        • 运行classpath:运行项目的时候使用
      • 依赖范围:用来控制依赖与三种classpath的关系(编译classpath、测试classpath、运行classpath)
        • compile(默认):编译依赖范围。对编译、测试、运行三种classpath都有效。如spring-core,编译、测试、运行都需要使用该依赖
        • test:测试依赖范围。仅对测试classpath有效。如junit,仅在编译测试代码和运行测试时使用该依赖
        • provided:已提供依赖类型。仅对编译和测试classpath有效,运行时无效。如servlet-api,编译和测试需要使用此依赖,运行时因容器已提供,无需Maven重复引入
        • runtime:运行时依赖范围。仅对测试和运行classpath有效,编译主代码时无效。如JDBC驱动,编译主代码时仅需要JDK的JDBC接口,具体的JDBC驱动仅在测试和运行时使用
        • system:系统依赖范围。与三种classpath的关系与provided相同。因依赖于本机系统绑定,可能不可移植,谨慎使用!
        • import(Maven2.0.9及以上):导入依赖范围。不对三种classpath造成影响。
    • 5.3传递依赖
      • 5.3.1什么是传递依赖?

        • A->B,B->C,C为A的传递依赖。B为A的第一依赖,C为A的第二依赖。
      • 5.3.1依赖范围影响传递依赖
        • 第一依赖的依赖范围和第二依赖的依赖范围决定了传递性依赖的范围。
        • 图中,列为第一依赖范围,行为第二依赖范围。
        • 1)当第二依赖是compile的时候,传递依赖的范围与第一依赖一致
        • 2)当第二依赖是test的时候,依赖不会传递
      • 5.3.2 依赖调解
        • 什么是依赖调解?

          • 当传递依赖造成问题的时候(如依赖冲突),Maven定义了一些原则来判断传递依赖需要从哪条依赖路径引入的,确定仅适用依赖的一个版本。
        • 第一原则:路径短者优先
          • 例子:项目A有如下依赖关系:A->B->C->X(1.0),A->D->X(2.0),X是A的传递依赖,哪个版本X会被解析使用?
          • 答案:路径短者优先。X(1.0)路径长度为3,X(2.0)路径长度为2,所以,选用X(2.0)
        • 第二原则(Maven2.0.9及以上):第一声明优先
          • 例子:项目A有如下的依赖关系:A->B->X(1.0),A->C->X(2.0),X是A的传递依赖,哪个版本X会被教习使用?
          • 答案:第一声明者优先。在依赖路径长度相等的前提下,在pom中谁先声明谁被解析使用。
    • 5.8可选依赖
      • 例子:项目A依赖项目B,项目B依赖项目X和Y。
      • 1)如果依赖范围为compile,X和Y为A的传递依赖
      • 2)如果X和Y配置为B的可选依赖,则依赖不会传递,即X、Y将不会对A产生影响
    • 5.9最佳实践
      • 1)排除依赖

        • 示例:项目A依赖于项目B,项目B依赖项目C,由于某些原因,不想引入传递依赖C,而是想使用C(1.10)版本。
        • 方法:使用exclusions排除依赖,并显式声明C(1.10)的依赖

        2)归类依赖

        • 依赖来自同一项目的不同模块,且版本都是相同的,未来升级时,这些依赖会一起升级。如spring项目含spring-core,spring-context等模块。
        • 方法:定义一个版本property,依赖声明中引用此版本

《Maven实战》第5章 坐标和依赖的更多相关文章

  1. 学习笔记——Maven实战(一)坐标规划

    坐标是什么?为什么要规划? 坐标是Maven最基本的概念,它就像每个构件的身份证号码,有了它我们就可以在数以千万计的构件中定位任何一个我们感兴趣的构件.举个最简单的例子,如果没有坐标,使用JUnit的 ...

  2. [Maven实战](7)坐标

    1. 简单介绍 maven的世界中拥有数量很巨大的构件,也就是平时用的一些jar,war等文件. 在maven为这些构件引入坐标概念之前,我们无法使用不论什么一种方式来唯一标识全部这些构件. 因此,当 ...

  3. Maven实战(十一)eclipse下载依赖jar包出问题

    问题描述 在pom.xml中配置了依赖,但是提示依赖不成功,或在本地仓库找不到相关依赖 大致错误如下: ArtifactDescriptorException: Failed to read arti ...

  4. 学习笔记-[Maven实战]-第三章:Maven使用入门(1)

    说明:[Maven实战]一书还介绍了怎么样手工创建Maven工程,学习这本书是为了能尽快在工作中使用,就忽略了手工建工程的部分 如果想了解这部分的内容,可以自己看看书 开始: 1.新建一个maven工 ...

  5. maven第5章坐标和依赖

    5.5依赖范围 runtime:运行时依赖范围 举的例子是JDBC驱动实现,不理解? 编译的时候只需要引入jdk提供的jdbc类和方法,比如java.sql.*;这时编译没有报错,但是没有引入mysq ...

  6. Maven学习(二) -- 坐标和依赖

    标签(空格分隔): 学习笔记 坐标 实际就像在几何中,我们用一对坐标(x, y)来表示坐标系中唯一的点:或者我们可以用(经度,纬度)来表示地球上的某一个位置,在Maven的世界中,有坐标来唯一的表示项 ...

  7. Maven学习笔记2(坐标和依赖)

    1.坐标 Maven坐标为各个构件建立了秩序,任何一个构件都必须明确自己的坐标,一个maven坐标是由一些元素确定的 <groupId>com.alivn.account</grou ...

  8. Maven实战(五)坐标详解

    1.为什么要定义Maven坐标      在我们开发Maven项目的时候,需要为其定义适当的坐标,这是Maven强制要求的.在这个基础上,其他Maven项目才能应用该项目生成的构件. 2.Maven坐 ...

  9. 学习笔记-[Maven实战]-第三章:Maven使用入门(3)

    这里说一下在建测试工程里遇到的问题 1.第一次建工程,junit依赖始终没有成功,最后删除现在工程,新建了一个工程就好了 2.使用junit4的问题.工程默认的依赖是junit3.8.1,我改成了4. ...

随机推荐

  1. linux配置sftp用户的chroot步骤(用户的sftp根文件夹)

    1.编辑ssh中的sftp的配置,命令可能是:vi /etc/ssh/sshd_config 在这个文件里最后增加 #限制sftp组的用户使用sftp时在自己的home文件夹下 Match Group ...

  2. cocos3.x 接入微信无法调用回调函数onResp的问题

    要想顺利调用必须保证一下几点: 1.WXEntryActivity的包名必须正确,格式为你的APK包名+wxapi.WXEntryActivity(注意:是apk包名,而不是org.cocos2dx. ...

  3. Android Download机制详解(一)DocumentUI部分

    在Android中Google为我们集成了一套十分便利的Download机制,用来下载网络上的资源文件.以此省去了我们编写和维护大量与Download相关的代码. 组成 Android中Downloa ...

  4. Powershell Get-FileHash

    File Hash (Get-FileHash C:\fso\myfile.txt).hash Get-FileHash C:\Users\Andris\Downloads\Contoso8_1_EN ...

  5. Oracle实例的恢复、介质恢复( crash recovery)( Media recovery)

    实例的恢复( crash recovery) 什么时候发生Oracle实例恢复? shutdown abort; 数据库异常down掉(机器死机,掉电...) 实例恢复的原因是数据有丢掉,使用redo ...

  6. “CMake”这个名字是“cross platform make”

    cmake_百度百科 https://baike.baidu.com/item/cmake/7138032?fr=aladdin CMake 可以编译源代码.制作程序库.产生适配器(wrapper). ...

  7. work_log

    机房搬迁 1. 虚拟机-à实体机 2. ldap 服务器 3. 考勤数据服务器 4. glpi 权限管理. 5. 备份脚本. 6. 试验jira重新启动. Luke--- 1,报价文档,相关技术者,技 ...

  8. Django-1版本的路由层、Django的视图层和模板层

    一.Django-1版本的路由层(URLconf) URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:我们就是以这种方式告诉Dja ...

  9. java 中JFinal getModel方法和数据库使用出现问题解决办法

    JFinal getModel方法(从页面表单中获取Model对象)+数据库存储问题 一.getmodel方法 1.在JConfig配置类中的数据库映射(存储到数据库时需要此配置) public vo ...

  10. C#实现对图片文件的压缩、裁剪操作实例

    本文实例讲述了C#对图片文件的压缩.裁剪操作方法,在C#项目开发中非常有实用价值.分享给大家供大家参考.具体如下: 一般在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便 ...