maven实战总结,Maven依赖解析

2019-10-01 14:35 来源:未知

 本文将记录Maven工程中依赖解析机制,内容包括:

1.POM文件

  1. Maven依赖基本结构
  2. 从仓库解析依赖的机制
  3. 依赖传递性解析实例
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>homethy-whitepages-reptile</groupId>
    <artifactId>homethy-whitepages-reptile</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

modelVersion:POM 模型的版本

1. Maven依赖基本结构

上篇文章记录了Maven依赖的聚合与继承,POM中依赖的声明通过dependency进行定义,并且通过groupId、artifactId及version三项定位Maven库中的唯一依赖。除了这三项外,还有其他属性进行限制,如下:

 1 <dependencies>
 2    <dependency>
 3      <groupId>...</groupId>
 4      <artifactId>...</artifactId>
 5      <version>...</version>
 6      <type>...</type>
 7      <scope>...</scope>
 8      <optional>...</optional>
 9      <exclusions>
10         <exclusion>
11             <groupId>...</groupId>
12             <artifactId>...</artifactId>
13         </exclusion>
14      </exclusions>
15    </dependency>
16 </dependencies>
  • groupId、artifactIdversion三项不再叙说;
  • type:依赖类型,对应于项目坐标定义的packaging,默认为jar;
  • scope:依赖范围,包括compile、test、runtime、import、provided、system;
  • optional:标记依赖为可选,即依赖没有传递性;
  • exclusions:排除传递性依赖

groupId:项目属于哪个组,或哪个组与此有关联

1.1 依赖范围

  我们知道,Maven工程约定具有固定的目录结构,以便于Maven各插件对工程处理,如编译(compile)插件,会将src/main/java中的类编译到target/classes目录下,则编译对应的classpath即为target/classes。依赖范围就是控制依赖于编译classpath(target/classes)、测试classpath(target/test-classes)和运行classpath(以Web工程为例,WEB-INF/classes)的关系。具体依赖范围的讲述可参考官网文档,在此仅进行稍微总结:

  • compile:编译依赖范围,对编译、测试、运行classpath都有效,为默认范围;
  • test:测试依赖范围,仅对测试classpath有效;
  • runtime:运行时依赖范围,对测试和运行classpath有效,对编译无效,如JDBC的依赖引入,因为JDK中值声明了JDBC接口,具体实现由各厂家决定;
  • import:导入依赖范围,对三种classpath不产生实际影响,一般是导入pom类型的依赖,聚合情况下需要声明打包类型为pom,其中可包含dependencyManagement(如上一篇文章),此时对引入该依赖的工程不产生影响;
  • provided:已提供依赖范围,对测试和编译classpath有效,对运行时无效,如servlet-api在测试或编译的时候需要,在运行的时候由容器提供,故不需要重复引入;
  • system:系统依赖范围,与provided范围一致,需要明确指定该jar包,其不在Maven仓库中,感觉不太常用。

artifactId:定义了项目在Maven中唯一的ID

1.2 依赖传递性

依赖传递性,举例说明,比如A引用B,B引用C,正常情况下,A也会引用C依赖,即A经过传递间接引用了C(依赖为可选时,需另行处理)。具体不同范围的依赖经过传递后,其依赖范围的变化如下边(从官网扣下来的)

图片 1

依赖传递的准则

  • 路径最近这优先,即在引用传递链上,获取出离本POM最近的传递性依赖;
  • 如果路径距离相同,则以取POM中的声明顺序靠前的。

version:版本号

TAG标签:
版权声明:本文由金沙澳门官网4166发布于世界史,转载请注明出处:maven实战总结,Maven依赖解析