# Maven 依赖范围

> 原文： [https://howtodoinjava.com/maven/maven-dependency-scopes/](https://howtodoinjava.com/maven/maven-dependency-scopes/)

**Maven 依赖范围**属性用于指定相对于不同生命周期阶段（构建，测试，运行时等）的依赖项可见性。 Maven 提供了六个范围，即`compile`，`provided`，`runtime`，`test`，`system`和`import`。

```java
Table of Contents

1\. Compile Scope
2\. Provided Scope
3\. Runtime Scope
4\. Test Scope
5\. System Scope
6\. Import Scope
7\. Transitivity Resolution
```

## Maven 依赖范围 – `compile`

这是 **maven 默认范围**。 *构建*，*测试*和*运行*项目需要具有`compile`范围的依赖项。

在大多数情况下，必须使用范围`compile`才能将`import`语句解析为您的 Java 类源代码。

```java
<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.14</version>
		<!-- You can ommit this because it is default -->
		<scope>compile</scope>
	</dependency>
</dependencies>

```

## Maven 依赖范围 – `provided`

Maven 依赖范围`provided`在**构建和测试**期间用于整个项目。 它们也需要运行，但是**不应导出**，因为依赖项将由运行时提供，例如，由 servlet 容器或应用服务器提供。

```java
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

```

## Maven 依赖范围 – `runtime`

不需要构建具有 maven 依赖范围`runtime`的依赖项，但它们是**测试和运行**项目的类路径的一部分。

```java
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.4</version>
    <scope>runtime</scope>
 </dependency>

```

## Maven 依赖范围 – `test`

不需要使用 maven 依赖范围`test`来构建和运行项目。 需要它们来**编译和运行单元测试**。

```java
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>

```

## Maven 依赖范围 – `system`

具有`system`的依赖项与具有范围`provided`的依赖项相似。 唯一的区别是`system`依赖项不是从远程仓库中检索到的。 它们位于项目的子目录下，并从那里进行引用。 有关更多详细信息，请参见[外部依赖项](//howtodoinjava.com/maven/maven-dependency-management/#external-dependency)。

```java
<dependency>
  <groupId>extDependency</groupId>
  <artifactId>extDependency</artifactId>
  <scope>system</scope>
  <version>1.0</version>
  <systemPath>${basedir}\war\WEB-INF\lib\extDependency.jar</systemPath>
</dependency>

```

## Maven 依赖范围 – `import`

`import`范围仅在`dependencyManagement`部分中的类型为`pom`的依赖项上受支持。 它在指定的 POM 的`dependencyManagement`部分中指示要用有效的依赖项列表替换的依赖项。

```java
<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>

```

## Maven 依赖项可传递性解析

当您包含一个 maven 依赖项并且它具有它自己的其他依赖项（即传递性依赖项）时，您可能还想弄清楚这些传递性依赖项的范围。

让我们用一个简单的表来了解 **maven 传递依赖项**。 在此表中，如果在左列中将*范围设置为依赖项，则在顶部行*的*可传递依赖项将导致在其交点处列出的范围。*

| 依赖项 | 编译 | 提供 | 运行 | 测试 |
| --- | --- | --- | --- | --- |
| `compile` | `compile` | – | `runtime` | – |
| `provided` | `provided` | – | `provided` | – |
| `runtime` | `runtime` | – | `runtime` | – |
| `test` | `test` | – | `test` | – |

将我的问题放在评论部分。

学习愉快！