快速上手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. 参考链接
Introduction to Repositories https://maven.apache.org/guides/introduction/introduction-to-repositories.html
Using a Repository Manager https://maven.apache.org/repository-management.html
Using Mirrors for Repositories https://maven.apache.org/guides/mini/guide-mirror-settings.html