# Maven – 依赖管理

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

在 Maven 中，依赖项是您当前项目为了编译，构建，测试和/或运行而需要的另一个归档文件（JAR，ZIP 等）。 依赖项收集在`<dependency>`标签内的`pom.xml`文件中。

当您运行构建或执行 Maven 目标时，将解决这些依赖项，然后从本地仓库加载这些依赖项。 如果它们不存在，那么 Maven 将从远程仓库下载它们并将它们存储在本地仓库中。 您也可以手动安装依赖项。

> 了解更多：[本地仓库路径](//howtodoinjava.com/maven/how-to-change-maven-local-repository-path-in-windows/)

```java
Table of Contents

Dependency Example
External Dependency
Dependency Tree
Dependency Exclusion
Artifact Version Ranges
```

## Maven 依赖示例

在深入研究依赖管理之前，让我们看一个简单的示例，其中包含不同的元素，我们将在本文中讨论。

```java
	<dependencies>

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

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.5.RELEASE</version>
		</dependency>

	</dependencies>

```

如果`pom.xml`指向同一`groupId`的许多工件，则应使用属性以便分解代码以便于维护。

```java
<properties>
  <junit.version>4.12</junit.version>
  <spring.version>4.3.5.RELEASE</spring.version>
</properties>

	<dependencies>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

	</dependencies>

```

## 外部依赖

有时，您将必须引用不在 maven 仓库（本地，中央或远程仓库）中的 jar 文件。 您可以通过将这些 jar 放在项目的`lib`文件夹中来使用它们，并配置外部依赖项，如下所示：

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

```

*   `groupId`和`artifactId`都设置为依赖项的名称。
*   `scope`元素值设置为`system`。
*   `systemPath`元素引用 JAR 文件的位置。

## Maven 依赖树

使用 maven 的`dependency:tree`命令，可以传递地查看项目中所有依赖项的列表。 传递依赖表示如果 A 依赖于 B 而 B 依赖于 C，则 A 依赖于 B 和 C。

当不同依赖项包含相同工件的不同版本时，传递性带来了一个非常严重的问题。 它可能会在运行时导致**版本不匹配**问题。 在这种情况下，`dependency:tree`命令对于处理 JAR 冲突非常有用。

```java
$ mvn dependency:tree
```

它以给定的格式输出依赖项信息：

```java
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ MavenExamples ---
[INFO] com.howtodoinjava.demo:MavenExamples:jar:0.0.1-SNAPSHOT
[INFO] +- junit:junit:jar:3.8.1:test
[INFO] \- org.springframework:spring-core:jar:4.3.5.RELEASE:compile
[INFO]    \- commons-logging:commons-logging:jar:1.2:compile

```

了解它如何通知 spring 依赖`commons-logging`。 同样，您可以使用此命令获取完整的传递依赖项信息。

## Maven 依赖排除

除了由传递依赖引起的版本不匹配问题之外，项目工件和部署平台（例如 Tomcat 或其他服务器）之间的工件之间可能存在**版本不匹配**。

为了解决此类版本不匹配的问题，maven 提供了`<exclusion>`标记，以打破传递依赖项。

例如，当您在类路径中具有 JUnit4.12 并包括 DBUnit 依赖项时，则需要删除 JUnit 3.8.2 依赖项。 可以使用`exclusion`标签完成。

```java
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>${junit.version}</version>
	<scope>test</scope>
</dependency>
<dependency>
	<groupId>org.dbunit</groupId>
	<artifactId>dbunit</artifactId>
	<version>${dbunit.version}</version>
	<scope>test</scope>
	<exclusions>
		<!--Exclude transitive dependency to JUnit-3.8.2 -->
		<exclusion>
		    <artifactId>junit</artifactId>
		    <groupId>junit</groupId>
		 </exclusion>
	</exclusions>
</dependency>

```

## 工件版本范围

在包含依赖项的同时，您可以自由地为任何工件指定版本范围。 要给出版本范围，可以使用以下符号：

*   括号符号`(`和`)`表示包含范围
*   括号符号`[`和`]`表示排除范围
*   逗号分隔的子集

#### 版本范围示例

让我们看一些示例，以更好地了解有关指定版本范围的信息。

| 范围 | 含义 |
| --- | --- |
| `1.2` | 等于 1.2 或以 1.2 开头的版本 |
| `(,1.2]` | 小于 1.2 的任何版本。 包含 1.2 版。 `x <= 1.2` |
| `(,1.2)` | 小于 1.2 的任何版本。 1.2 版除外。 `x < 1.2` |
| `[1.2]` | 仅限于 1.2 版。 `x == 1.0` |
| `[1.2,)` | 任何大于 1.2 的版本。 包含 1.2 版。 `x >= 1.2` |
| `(1.2,)` | 任何大于 1.2 的版本。 1.2 版除外。 `x > 1.2` |
| `(1.2,2.2)` | 在 1.2 和 2.2 之间的版本。 两者都排除在外。 `1.0 < x < 2.0` |
| `[1.2,2.2]` | 在 1.2 和 2.2 之间的版本。 两者都包括在内。 `1.2 <= x <= 2.2` |
| `(,1.2],[2.2,)` | 小于 1.2 或大于 2.2 的版本。 两者都包括在内。 `x <= 1.2 or x >= 2.2` |

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

学习愉快！