Maven 依赖范围

Maven 依赖范围(Dependency Scope)指定了依赖关系的作用范围,主要有以下几种:
compile:默认的依赖范围,编译、测试和运行阶段都有效。
provided:编译、测试阶段有效,但是在运行阶段不会包含在 classpath 中,需要由运行环境提供。
runtime:测试和运行阶段有效,但是在编译阶段不会包含在 classpath 中。
test:只在测试阶段有效,不会包含在运行阶段的 classpath 中。
system:需要在本地系统中提供一个指定的 jar 包,通常不推荐使用。
import:该依赖只是作为依赖传递过来的POM信息,不参与编译和运行,主要用于依赖管理之间的继承关系。

一个典型的依赖项配置如下所示:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.13.RELEASE</version>
    <scope>compile</scope>
</dependency>

在上面的配置中,元素用于指定依赖范围。如果不指定该元素,默认为 compile 依赖范围。在实际开发中,合理地使用依赖范围可以有效地减少项目的依赖项,提高项目的构建效率和运行效率。

在 Maven 依赖范围中,provided 和 import 是两种比较特殊的依赖范围。

1、provided
provided 是指 Maven 项目在运行时所依赖的某个 jar 包不会被打包到最终生成的 jar 包中,而是由运行环境提供。也就是说,这个 jar 包必须存在于运行环境中,否则项目就无法正常运行。通常情况下,provided 依赖范围用于 Java Web 应用程序的部署,因为 Web 应用程序的容器通常都已经内置了常用的类库,不需要将这些类库打包到应用程序中。

示例:

假设我们的项目中需要使用 Servlet API,在 pom.xml 中可以这样配置:

<dependencies>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

2、import
import 是 Maven 2.0.9 引入的一种依赖范围,用于解决多模块 Maven 项目之间依赖传递的问题。如果一个 Maven 项目 A 依赖另一个 Maven 项目 B,而 B 又依赖了 C 和 D 两个项目,那么在项目 A 中就需要分别声明对 B、C、D 三个项目的依赖关系。这样的话,项目 A 中的 pom.xml 文件中就会出现重复的依赖声明,显得比较冗余。

为了解决这个问题,Maven 2.0.9 引入了 import 依赖范围。当项目 A 声明对项目 B 的依赖时,可以将 B 的 pom.xml 文件中的依赖声明导入到 A 的 pom.xml 文件中,这样 A 就不需要再重复声明 C 和 D 的依赖了。

示例:

假设项目 A 依赖项目 B,而项目 B 又依赖项目 C,那么在项目 A 的 pom.xml 文件中可以这样配置:

<dependencies>
  <dependency>
    <groupId>com.example</groupId>
    <artifactId>project-b</artifactId>
    <version>1.0</version>
    <type>pom</type>
    <scope>import</scope>
  </dependency>
</dependencies>

这里需要注意的是,import 依赖范围只适用于 pom 类型的依赖。在上面的例子中,项目 B 的依赖声明中必须将 指定为 pom,否则 import 依赖范围将不会生效。