Maven完全指南 - 6. 仓库管理

931 阅读5分钟

6. 仓库管理

Maven 仓库管理是 Maven 依赖管理的核心部分,用于存储、获取、发布和管理构件。Maven 仓库分为 本地仓库、远程仓库和中央仓库,通过合理配置仓库和仓库管理的方式,Maven 可以方便地管理项目依赖、插件及版本控制。

仓库管理.png

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>来区分具体的仓库。