Maven的依赖范围

535 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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>