一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。 Maven 是 Java 生态系统中最流行的构建工具之一,其核心特性之一是依赖管理。 Maven依赖项范围属性用于指定依赖关系的可见性,相对于不同的生命周期阶段(构建,测试,运行时等)。Maven提供六个范围compile, provided, runtime, test, system, and import.
一、依赖类型
直接依赖
直接依赖项是我们明确包含在项目中的那些依赖,使用 标签包括的,比如以下依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
传递依赖
是指在别的JAR包中,已经直接依赖的内容,会传递到引用的项目中
可以使用mvn dependency:tree命令列出项目中所有依赖项
二、依赖范围
scope元素的作用:控制 dependency 元素的使用范围。通俗的讲,就是控制 Jar 包在哪些范围被加载和使用。包括以下六种依赖范围
Compile
这是没有提供其他范围时的默认范围。被依赖项目需要参与到当前项目的编译,测试,打包,运行等阶段。打包的时候通常会包含被依赖项目,这些依赖性也是传递的:
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
Provided
我们使用此范围来标记应由JDK或容器在运行时提供的依赖项。被依赖项目理论上可以参与编译、测试、运行等阶段,相当于compile,但是再打包阶段做了exclude的动作。
比如部署在某些容器中的Web应用程序,其中容器已经提供了一些库本身。例如,这可能是已在运行时提供servlet API的Web服务器。在我们的项目中,我们可以使用Provided定义这些依赖项:
Provided的依赖项仅在编译时和项目的测试类路径中可用。这些依赖性也不是传递。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
runtime
含义:表示被依赖项目无需参与项目的编译,但是会参与到项目的测试和运行。与compile相比,被依赖项目无需参与项目的编译。
适用场景:例如,在编译的时候我们不需要 JDBC API 的 jar 包,而在运行的时候我们才需要 JDBC 驱动包。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
<scope>runtime</scope>
</dependency>
test
含义: 表示被依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。
适用场景:例如,Junit 测试。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
system
含义:system 元素与 provided 元素类似,但是被依赖项不会从 maven 仓库中查找,而是从本地系统中获取,systemPath 元素用于制定本地系统中 jar 文件的路径。例如:
<dependency>
<groupId>com.baeldung</groupId>
<artifactId>custom-dependency</artifactId>
<version>1.3.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/custom-dependency-1.3.2.jar</systemPath>
</dependency>
import
Import Scope仅支持DependencyManagement部分中类型POM的依赖项。它表示依赖于指定的POM的DepengenceManagement部分中的依赖项的有效列表。
它只使用在中,表示从其它的pom中导入dependency的配置,例如 (B项目导入A项目中的包配置):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>other.pom.group.id</groupId>
<artifactId>other-pom-artifact-id</artifactId>
<version>SNAPSHOT</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>