maven实战 读书笔记(二)

坐标定义

<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<package>jar</package>

groupId:定义当前Maven项目隶属的实际项目。groupId的表示方式与Java包名的表示方式类似,通常与域名反向一一对应。
artifactId:该元素定义项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。
version:该元素定义Maven项目当前所处的版本。
packaging:该元素定义Maven项目的打包方式。
classifier:该元素用于帮助构建输出的一些附属构建。
groupId、artifactId、version必须定义,packaging可选,而classifier是不能直接定义的。
项目构建的文件名是与坐标相对应的,一般的规则为artifactId-version [-classifier].packaging,[-classifier]表示可选。

依赖配置
根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。元素有每个依赖可以包含的:
groupId、artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar。
scope:依赖的范围。
optional:标记依赖是否可选。
exclusions:用来排除传递性依赖。

依赖范围
Maven有以下几种依赖范围
    compile:编译依赖范围。默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。
    test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目时将无法使用此类依赖。
    privided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试calsspath有效,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍。
    runtime:运行时依赖范围。对于测试和运行classpath有效,但在编译主代码时无效,
    system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致。使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植。
    import:导入依赖范围。

maven实战 读书笔记(二)_第1张图片

传递性依赖和依赖范围

maven实战 读书笔记(二)_第2张图片

假设A依赖于B,B依赖于C,A对于B是第一个直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围。
当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致;当第二直接依赖的范围是test的时候,依赖不会得以传递;当第二直接依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为provided;当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性依赖的范围为runtime.

依赖调解

Maven依赖调解的第一原则是:路径最近者优先。第二原则:第一声明者优先。在理想的情况下,是不应该使用可选依赖的。

查看当前项目的已解析依赖 mvn dependency:list
查看当前的依赖树 mvn dependency:tree
分析当前项目的依赖 mvn dependency:analyze

你可能感兴趣的:(maven,依赖,坐标)