《Maven实战》第5章 坐标和依赖

  • 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,依赖声明中引用此版本

猜你喜欢

转载自blog.csdn.net/hanhan122655904/article/details/114368437
今日推荐