maven下的经常使用的几个元素以及依赖范围的一些知识

  maven的pom.xml配置文件里面的project根节点下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个依赖,每个依赖都可以包含的元素:
  groupId,artifactIdversion:依赖的基本坐标,对于任何依赖来说,基本坐标最重要,maven根据坐标才能找到对应的依赖;

  type:依赖的类型,对应项目坐标定义的packaging,大部分情况下无须声明,默认是jar;

  scope:依赖的范围;

  optional:标记依赖是否可选;

  exclusions:用来排除传递性依赖;

  一般情况下,大部分依赖声明只包含基本坐标,一些特殊情况,其他元素的地位也至关重要;

  下面是scope元素的几个参数,都有自己的范围,超出范围将会无效:

  compile:编译依赖范围,若未指定依赖范围,会默认该依赖范围,使用该依赖范围的maven依赖,对于编译测试运行的classpath都有效;比较典型的就是spring-core,在编译、测试和运行项目的时候都需要使用到该依赖;

  test:测试依赖范围,使用该依赖范围的maven依赖,只对测试的classpath有效;典型的就是Junit,它只有在编译测试代码的时候才有效;

  provided:已提供依赖范围,使用该依赖范围的maven依赖,只对编译测试的classpath有效,但在运行时无效;典型的就是servlet-api,编译和测试的时候需要该依赖,但在运行项目的时候,由于容器已经提供了,就不需要maven重复的引入一遍;

  runtime:运行时依赖范围,使用此类范围的maven依赖,对于测试运行的classpath有效,但在编译主代码的时候无效。典型的例子是JDBC驱动的实现,项目住代码只需要JDK提供JDBC的接口,只有在测试或者运行项目的时候才需要实现上述接口的具体实现;

  system:系统依赖范围,使用此类范围的maven依赖,也是对应编译测试的classpath有效,运行时无效,但是使用该范围的依赖,必须显式的通过systemPath指定依赖的路径(因为此类依赖不是通过maven仓库解析的,而往往与本地机绑定,可移植性比较差,谨慎使用),可以引用环境变量,例子如下:

<dependency>
     <groupId>javax.sql</groupId>
     <artifactId>jdbc-stdext</artifactId>
     <version>2.0</version>
     <scope>system</scope>
     <systemPath>${jave.home}/lib/rt.jar</systemPath>
</dependency>

  以下是一个简单的表格(Y代表有效,N代表无效);

依赖范围(scope) 对于编译classpath有效 对于测试classpath有效

对于运行classpath有效

典型例子
compile Y Y Y spring-core
test N Y N Junit
provided Y Y N servlet-api
runtime N Y Y JDBC驱动实现
system Y Y N 本地的,Maven仓库以外的类库文件
原文地址:https://www.cnblogs.com/zhang-yawei/p/10156752.html