认识Maven及其依赖

        Maven是构建工具,还是一个依赖管理工具和项目信息管理工具。它帮我们自动也构建,还能够抽象构建过程。提供构建任务实现。它跨平台,对外提供了一致的操作接口。它提供了中央仓库,能帮我们自动下载构件。Maven还能帮助我们管理原本分散在项目中各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等。       Maven还为全世界的Java开发者提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源类库。通过一些Maven的衍生工具(如Nexus)我们还能对其进行快速地搜索。只要定位了坐标,Maven就能够帮我们,省去了手工劳动。
        Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
        Maven中拥有很多构件,为了便于管理和使用Maven引入了坐标的概念。Maven定义了这样一组规则:任何一个构件都可以使用坐标唯一标识,Maven坐标的元素包括:groupId、artifactId、version、packaging、classifier等。
配置文件解析
groupId
         定义当前Maven项目隶属的实际项目。
artifactld
         该元素定义实际 项目中的一个Maven项目(模块)。
version
         该元素定义Maven项目当前所处的版本。
scope
         依赖的范围,就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系。Maven主要有以下几种依赖范围:
  • compile:编译依赖范围。默认范围,使用此范围,对于编译、测试、运行三种classpath都有效。典型例子是spring-core,在编译、测试和运行的时候都需要使用该依赖。
  • test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或运行项目时无法使用此依赖。典型例子是JUnit,它只有在编译测试代码及运行测试的时候才需要。
  • provided:已提供依赖范围。对于编译和测试classpath有效,但在运行时无效。典型例子是servlet-api,编译和测试项目的时候需要该依赖。但在运行项目的时候,由于容器已经提供, 就不需要Maven重复地引入一遍。
  • runtime:运行时依赖范围。对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现 上述接口的具体JDBC驱动。
  • system:系统依赖范围。该依赖与三种classpath的关系和provided依赖范围完全一致。但是,使用system范围的依赖时必须通过systemPath元素显式的指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此要谨慎使用。
  • import:导入依赖范围。该范围不会对三种classpath产生实际的影响。
传递性依赖
        举个例子说明,有三个构件A、B和C,他们的关系是A依赖B,B依赖C。假设C的依赖范围是compile,B的依赖范围也是compile,那么A的依赖范围则也是compile。关系如下图:
认识Maven及其依赖_第1张图片

        如上图中,我们说A对B的依赖第一直接依赖,B对C是第二直接依赖,A对C是传递性依赖。第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围。test、provided、runtime范围的依赖都取决于第一直接依赖,但是compile除外当第一直接依赖是compile,第二直接依赖是runtime时,传递性依赖的范围是runtime。
依赖调解
       项目A有这样的依赖关系:A->B->C->X(1.0)、A->D->X(2.0),X是A的传递性依赖,  但是两条依赖路径上有两个版本X,我们需要选择一个。根据Maven依赖调解的第一原则:路径最近者优先。X(1.0)的路径长度为3,X(2.0)路径长度为2,所以使用X(2.0)。如果两个路径长度一样,Maven依赖调解还有第二原则:第一声明者优先。路径相同的情况下,在POM中依赖声明的顺序靠前的会被使用。
可选依赖
        假设有这样一个依赖关系,项目A依赖项目B,项目B依赖项目X和Y,B对X和Y的依赖都是可选依赖:A->B、B->X(可选)、B->Y(可选)。如果三个依赖的范围都是compile,那么X、Y就应该是A的compile范围传递性依赖。然而,由于这里的X、Y都是可选依赖,依赖将不会传递。如下图所示:
认识Maven及其依赖_第2张图片

排除依赖
        exclusions中可以包含一个或读个exclusion子元素,所以可以排除一个或多个传递性依赖。需要注意的是,声明exclusion的时候只需要groupId和artifactId,而不需要version元素。
归类依赖
   
     
     
     
     
<properties>
<hibernate.version>2.5.6hibernate.version>
properties>
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-coreartifactId>
<version>${hibernate.version}version>
dependency>
这里简单用到了Maven属性。使用properties元素定义Maven属性,Maven运行的时候会将POM中的所有${hibernate.version}替换实际值2.5.6。

你可能感兴趣的:(【开发工具】,maven)