Maven如何自动解决jar库的依赖项。


出版日期:

更新:


技术文章 > Maven如何自动解决jar库的依赖项。

2026 状态和安全使用

结论: Maven 不会通过文件名发现任意 JAR。它解析声明的坐标,下载工件 POM,遵循 POM 的依赖关系,应用范围和可选规则,并在多个路径请求不同版本时使用依赖关系中介。

你将学到什么

  • 本地、中央、镜像和私有软件仓库如何参与解析。
  • 为什么依赖项的 POM(而不是 JAR 本身)描述了大多数传递性需求。
  • 如何在覆盖版本之前检查有效图表。

这适用于谁:想要了解下载的工件来自何处以及为什么会出现额外库的 Maven 用户。

截至 2026 年的适用情况:下面的旧 Apache POI 坐标仍然可以作为历史示例,而不是版本推荐。使用当前支持的依赖项、受信任的 HTTPS 软件仓库、可用的校验和/签名控制以及依赖项更新策略。

安全注意事项:原始文章中的命令和配置示例尚未在当前生产环境中重新运行。应用之前,请在单独的测试环境中验证支持的版本、备份、访问控制和回滚步骤。

官方主要来源

概述。

Maven 会从远程软件仓库下载 JAR 文件。本节说明其依赖解析流程。

阅读本文前,可以先通过下文了解 Maven 的基本用途。

什么是Maven,Maven是做什么的?

目录

  1. Maven 如何解析 JAR 依赖
  2. 摘要

1. Maven 如何解析 JAR 依赖

在 pom.xml 中声明 JAR 后,Maven 会下载该构件并解析传递依赖项。下面说明这一机制。

1-1. 在 pom.xml 中声明依赖

Maven 根据 pom.xml 中的依赖坐标解析构件。例如,Apache POI 3.17(用于处理 Excel 等 Microsoft Office 文件)可以按如下方式声明:

pom.xml


<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>

Maven 会下载 poi-3.17.jar,并根据其 POM 继续解析运行所需的传递依赖。实际项目应选择仍受支持的版本,并在升级前检查兼容性。

1-2. 从软件仓库下载构件

基本流程如下图所示。

Maven Repository。

Maven 默认从 Central Repository 下载公开构件:

https://repo1.maven.org/maven2/

下面的第三方索引可用于检索构件,但仓库配置应优先参考项目或组织的官方文档。

https://mvnrepository.com/repos

首次解析时,构件会缓存在本地仓库;后续构建通常复用缓存。Windows 的默认目录位于用户目录下的 “.m2\repository”,并不是 “.m2” 根目录本身。

确有需要时,可以在 pom.xml 中添加其他远程仓库。为保证可重复构建和供应链安全,应避免随意添加不受信任的仓库。

pom.xml


<repositories>
    <repository>
        <id>sonatype-nexus-snapshots</id>
        <name>Sonatype Nexus Snapshots</name>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
        </snapshots>
    </repository>
</repositories>

1-3. 传递依赖的解析机制

poi-3.17.jar 还依赖 commons-collections4-4.1.jar。Maven 会读取同一版本目录中的 POM 元数据,并据此构建依赖图:

https://repo1.maven.org/maven2/org/apache/poi/poi/3.17/

该目录中的 poi-3.17.pom 声明了直接依赖。Maven 在下载主 JAR 的同时读取 POM,并递归解析所需构件;版本冲突则按 Maven 的依赖调解规则处理。

2. 摘要

Maven 通过 POM 中的构件坐标和依赖声明解析依赖图,并把下载的文件缓存在本地仓库。

■技术文章

查看全部技术文章。


■作者简介

查看作者简介。


■联系我们

就本文内容联系我们。