七的博客

快速上手Maven(六)-镜像仓库

Maven

快速上手Maven(六)-Maven仓库

前几个章节讲过 Maven 的一个重要功能就是依赖管理 , 而依赖管理的的核心其实就是 Maven 仓库。没有 Maven 仓库的话,依赖管理是没办法工作的。

1. Maven 仓库是什么

简单来说,Maven 仓库就是是一个存储 JAR文件、库文件、插件的地方。 这些资源可以是公共的,也可以是私有的。

当构建一个 Maven 项目时 , Maven 会自动从仓库中下载所需的依赖 , 并将其包含在你的项目中。这个仓库可以是你本地的仓库,也可以是一个远程的仓库。

2. Maven 仓库的作用

Maven 仓库的主要作用是存储和管理项目的依赖 。 通过在 pom.xml 中进行依赖声明 , 而不需要手动下载和管理这些依赖。Maven 会自动从仓库中获取这些依赖 , 并将其包含在你的项目中。

这可以简化了项目的构建过程 , 同时还可以确保了项目在不同环境下的一致性。

3. Maven 仓库的分类

Maven 仓库主要分为两种类型 : 本地仓库和远程仓库。

3.1 本地仓库

本地仓库就是每个用户在自己的电脑上维护的一个仓库 , 它存储了该用户所有项目的依赖。

默认情况下 , Linux 系统本地仓库位于 ~/.m2/repository 目录,Windows 系统下为 %USER_HOME%\.m2\repository

当运行 Maven 构建时 , Maven 会首先在本地仓库中搜索所需的依赖。如果找到了 , 就直接使用。 如果没找到 , 就会尝试去远程仓库下载 , 然后存储到本地仓库中以备将来使用。

有些项目可能要在离线的环境下开发,这个时候可能就会提供一个巨大的离线依赖库,每个人安装到自己的电脑本地仓库中。

3.2 远程仓库

远程仓库就是在网络上的一个仓库 , 它可以被多个用户或项目共享。当本地仓库没有所需的依赖时,Maven 会自动从远程仓库下载。

远程仓库又可以分为下面几种:

  • 中央仓库。这是默认的远程仓库,它包含了大量常用的库。中央仓库的地址是 https://repo.maven.apache.org/maven2/

这个地址国内很多时候访问很慢,有时候还访问不了。

  • 私服。这是公司内部自己搭建的 Maven 仓库 , 用于共享组织内部的项目。私服可以提高构建速度 , 因为它通常在内网 ,下载速度很快。

上个小节提到的在离线环境下做项目开发,公司内部就可以搭建一套私服环境,私服环境中可以提前下载好大量的依赖。 比较常用的私服软件一般是 Nexus 。

  • 其他公共仓库。 一些公司或组织会提供公共的 Maven 仓库 , 如 JBoss 的仓库、Google 的仓库等。我们可以在项目的 pom.xml 中配置这些仓库的 URL,以便从这些仓库下载依赖。

4. 怎么配置 Maven 仓库

4.1 配置本地仓库

配置Maven仓库主要是通过修改Maven的配置文件settings.xml来实现。settings.xml 文件通常在两个地方可以找到:

  • 全局配置:${maven.home}/conf/settings.xml
  • 用户配置:${user.home}/.m2/settings.xml

用户配置会覆盖全局配置。要配置本地仓库的位置,可以在 settings.xml 中添加如下内容:

<settings>
  ...
  <localRepository>/path/maven-repo</localRepository>
  ...
</settings>

4.2 配置远程仓库

远程仓库通常建议在项目的 pom.xml 文件中进行配置。举个例子:

<project>
  ...
  <repositories>
    <repository>
      <id>jboss-repo</id>
      <url>https://repository.jboss.org/nexus/content/groups/public/</url>
    </repository>
  </repositories>
  ...
</project>

这个配置添加了 JBoss 的公共仓库。 <id> 元素指定了仓库的标识符 , <url> 元素指定了仓库的 URL。

有些远程仓库是需要认证的 , 可以在 settings.xml 中配置用户名和密码:

<settings>
  ...
  <servers>
    <server>
      <id>jboss-repo</id>
      <username>admin</username>
      <password>password</password>
    </server>
  </servers>
  ...
</settings>

<id> 元素要跟 pom.xml 中的仓库 ID 相匹配。

4.3 配置 Maven 镜像

如果我们想要替换中央仓库或其他远程仓库 , 可以配置 Maven 镜像。镜像是一个远程仓库的完全复制,当 Maven 需要从远程仓库下载依赖时,实际上会从镜像下载。

在国内由于众所皆知的原因, 访问国外的 Maven 仓库可能会很慢 , 甚至无法访问。为了解决这个问题 , 通常会配置一个 Maven 仓库的国内镜像。

镜像可以在 settings.xml 中配置:

<settings>
  ...
  <mirrors>
    <mirror>
      <id>aliyun-mirror</id>
      <mirrorOf>central</mirrorOf>
      <url>https://maven.aliyun.com/repository/central</url>
    </mirror>
  </mirrors>
  ...
</settings>

这个配置使用阿里云的镜像替换了中央仓库。 <mirrorOf> 元素指定了被替换的仓库的 ID , central 是中央仓库的 ID。 <url> 元素指定了镜像的 URL。

通过配置了阿里云的镜像之后,下载 Maven 依赖会非常的快。

5. 手动安装 JAR 到本地仓库

有时候 , 你可能需要手动将一个 JAR 文件安装到本地 Maven 仓库中 , 特别是当这个 JAR 文件不在任何远程仓库中。

这个时候多个项目需要公用,你不想每一次都去复制一次。 比较典型的就是 Oracle-JDBC 驱动,因为版权原因,Maven的中央仓库没有去收录 Oracle 的驱动。

Maven 提供了一个 install:install-file 命令,允许你手动安装 JAR 文件到本地仓库。命令的基本语法如下:

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

替换上面几个参数:

  • -Dfile: JAR 文件的路径。
  • -DgroupId: JAR 的 Group ID。
  • -DartifactId: JAR 的 Artifact ID。
  • -Dversion: JAR 的版本号。
  • -Dpackaging: 打包类型,通常是 jar

举个例子。假设有一个名为 module-a-1.0.0.jar 的 JAR 文件,你想将其安装到本地仓库,并给它一个坐标 com.suny:module-a:1.0.0。你可以运行以下命令:

mvn install:install-file -Dfile=module-a-1.0.0.jar -DgroupId=com.suny -DartifactId=module-a -Dversion=1.0.0 -Dpackaging=jar

运行这个命令后,Maven 会将 module-a-1.0.0.jar 安装到本地仓库 , 并使用指定的坐标。

6. 发布 JAR 到远程仓库

我们也可以将自己的项目打包并发布到远程仓库 , 供其他同事或者开发人员使用。

要部署项目到远程仓库 , 首先需要在项目的 pom.xml 文件中配置 distributionManagement 元素。这可以告诉 Maven 你想将项目部署到哪个仓库:

<project>
  ...
  <distributionManagement>
    <repository>
      <id>suny-repo</id>
      <name>My Repository</name>
      <url>https://repo.suny.com/maven2</url>
    </repository>
  </distributionManagement>
  ...
</project>

这里配置了一个 ID 为 suny-repo 的部署仓库 , 它的地址是 https://repo.suny.com/maven2

如果你的远程仓库需要认证 , 还需要在 Maven 的 settings.xml 中配置这个仓库的用户名和密码:

<settings>
  ...
  <servers>
    <server>
      <id>suny-repo</id>
      <username>suny</username>
      <password>password</password>
    </server>
  </servers>
  ...
</settings>

最后使用 mvn deploy 命令将项目部署到远程仓库。

mvn clean deploy

这个命令会将项目打包并上传到配置的远程仓库。

7. 参考链接