6. 仓库管理
Maven 仓库管理是 Maven 依赖管理的核心部分,用于存储、获取、发布和管理构件。Maven 仓库分为 本地仓库、远程仓库和中央仓库,通过合理配置仓库和仓库管理的方式,Maven 可以方便地管理项目依赖、插件及版本控制。
6.1 仓库类型
-
本地仓库:(Local Repository)通常在用户主目录下,例如:~/.m2/repository。可以在 settings.xml 中通过
<localRepository>
配置来改变默认路径。本地仓库用于缓存和存储构件,避免重复下载。每次构建时,Maven 优先从本地仓库查找依赖,如未找到才会尝试从远程仓库下载。 -
远程仓库:(Remote Repository)企业或组织内部设置的 私有仓库 或其他第三方的 公共仓库,如 JCenter 或公司私有仓库。用于存储组织内部的构件、未发布到中央仓库的第三方依赖等。
-
中央仓库:(Central Repository)Maven 官方的公共仓库,默认配置地址是 repo.maven.apache.org/maven2 。中央仓库提供了大量常用构件和插件,是 Maven 默认的下载源。用户无需特别配置,Maven 会默认连接中央仓库获取依赖。
6.2 查找顺序
Maven 在构建过程中按照以下优先级查找依赖:
- 本地仓库:首先检查本地仓库。
- 远程仓库:如果本地仓库没有找到,Maven 会按 repositories 配置中的顺序逐一访问远程仓库。
- 中央仓库:如果没有配置任何远程仓库,或在远程仓库中没有找到,Maven 会继续访问中央仓库。
通过该查找顺序,Maven 优先使用本地资源,尽可能减少网络请求并加快构建速度。
6.3 仓库镜像
配置仓库镜像主要是用来提升访问速度。例如,在 settings.xml 中将中央仓库替换为国内的镜像,提高下载效率。
<mirrors>
<mirror>
<id>aliyun-maven</id>
<mirrorOf>central</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
6.4 仓库配置
配置仓库的主要目的是依赖下载,但除此之外,在构件发布时也需要配置仓库。下载依赖的仓库和发布构件的仓库配置的地方不一样,发布构件的仓库配置在 <distributionManagement>
元素下,而下载依赖的仓库配置在 <project>
根元素下。
发布构件的仓库配置:
<project>
...
<distributionManagement>
<repository>
<id>release-repo</id>
<url>http://mycompany.com/maven2/releases</url>
</repository>
<snapshotRepository>
<id>snapshot-repo</id>
<url>http://mycompany.com/maven2/snapshots</url>
</snapshotRepository>
</distributionManagement>
...
</project>
下载依赖的仓库配置:
<project>
<!-- 定义依赖的仓库 -->
<repositories>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>company-repo</id>
<url>https://repo.company.com/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<!-- 快照版本更新策略 -->
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<!-- 定义插件的仓库 -->
<pluginRepositories>
<pluginRepository>
<id>company-plugin-repo</id>
<url>https://repo.company.com/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
<repositories>
:定义依赖的仓库。<pluginRepositories>
:定义插件的仓库。
Maven 分为两个版本类型:
- 快照版本:表示项目在开发中,不稳定,随时可能更新。通过在版本号后加上
-SNAPSHOT
来表示快照版本,例如 1.0.0-SNAPSHOT。 - 正式版本:表示项目已完成且稳定的最终版本,例如 1.0.0。发布版本代表项目的一个正式、不可变的构建成果,一旦发布到远程仓库就不应修改,以确保依赖的稳定性。
快照版本由于其频繁的发布,因此 Maven 在处理快照版本的时候会定期检查更新,以便于开发过程中获取最新构建的依赖项。默认情况下,Maven 在使用快照版本时会缓存已下载的依赖项,并且每天最多只检查一次更新。这是通过 updatePolicy 配置来控制的,默认值为 daily。也就是说,如果在一天内多次构建项目,Maven 会直接从本地仓库使用已下载的快照版本,而不是每次都重新下载。
快照版本的更新策略可以通过仓库设置中的<updatePolicy>
元素去设置,Maven 支持四种更新策略:
- daily:这是 默认值更新策略,每天检查一次更新,若当天已经检查过,则直接从本地缓存加载。适合大多数开发需求,能有效减少不必要的网络请求。
- always:每次构建时都会检查并下载最新的快照版本。适用于希望始终使用最新代码的开发环境,但可能会增加构建时间。
- interval:X:每隔 X 分钟检查一次更新。例如,interval:10 表示每隔 10 分钟检查一次。
- never:永不检查更新,只使用本地缓存。适合需要稳定依赖的情况,避免因网络或仓库变更导致的版本变动。
比如:
<repositories>
<repository>
<id>snapshots-repo</id>
<url>https://my.repository.url/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
我们也可以在命令行中通过-U
选项强制从远程仓库拉取最新的快照版本:
mvn clean install -U
6.5 仓库认证
在 Maven 中,当需要向私有仓库发布构件或从私有仓库下载依赖时,通常需要进行身份认证。Maven 在用户的主目录下使用 settings.xml 文件(通常在 ~/.m2/settings.xml)配置仓库的认证信息。通过 <servers>
元素,可以为每个仓库配置唯一的 <server>
节点,其中包含 id、username 和 password 等认证信息。通过这种方式,Maven 会在构建过程中自动读取 settings.xml 中的认证信息,避免将敏感信息写入 pom.xml 中。
<settings>
<servers>
<server>
<id>rcompany-repo</id>
<username>my-username</username>
<password>my-password</password>
</server>
<server>
<id>company-plugin-repo</id>
<username>my-username</username>
<password>my-password</password>
</server>
</servers>
</settings>
注意:发布构件的仓库认证配置和下载依赖的仓库认证配置都在
<servers>
元素里进行配置,通过<id>
来区分具体的仓库。