跳到主要内容

仓库与私服

Maven 仓库用于存储项目所需的构件和插件。本章将介绍 Maven 仓库的类型、配置方法以及私服的搭建和使用。

Maven 仓库概述

Maven 仓库是存放构件的地方。构件可以是 JAR 文件、WAR 文件、POM 文件或其他类型的文件。Maven 在构建项目时会从仓库中获取所需的依赖。

仓库的类型

Maven 仓库分为三种类型:

类型说明位置
本地仓库开发者本机的仓库默认 ~/.m2/repository
远程仓库网络上的仓库如 Maven 中央仓库
私服企业内部的仓库局域网内部

仓库的查找顺序

Maven 查找构件的顺序:

  1. 本地仓库:如果本地仓库有,直接使用
  2. 远程仓库:如果本地没有,从远程仓库下载到本地
  3. 中央仓库:如果没有配置其他远程仓库,从中央仓库下载

本地仓库

默认位置

本地仓库默认位于用户主目录下的 .m2/repository 目录:

  • Windows:C:\Users\用户名\.m2\repository
  • Linux/macOS:~/.m2/repository

修改本地仓库位置

settings.xml 中配置:

<settings>
<localRepository>D:/maven/repository</localRepository>
</settings>

本地仓库结构

本地仓库按照 groupId、artifactId、version 的目录结构存储构件:

repository/
└── org/
└── springframework/
└── spring-core/
├── 5.3.23/
│ ├── spring-core-5.3.23.jar
│ ├── spring-core-5.3.23.pom
│ └── spring-core-5.3.23.jar.sha1
└── maven-metadata-local.xml

远程仓库

Maven 中央仓库

Maven 中央仓库是默认的远程仓库,地址为:https://repo.maven.apache.org/maven2

配置远程仓库

在 pom.xml 中配置:

<repositories>
<repository>
<id>aliyun</id>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>

配置插件仓库

<pluginRepositories>
<pluginRepository>
<id>aliyun-plugin</id>
<name>阿里云插件仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</pluginRepository>
</pluginRepositories>

镜像配置

镜像可以拦截对远程仓库的请求,将其重定向到镜像地址。通常用于加速下载。

配置镜像

settings.xml 中配置:

<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>

mirrorOf 配置

mirrorOf 指定镜像代理哪些仓库:

说明
*代理所有仓库
central只代理中央仓库
external:*代理所有非本地仓库
repo1,repo2代理指定仓库
*,!repo1代理除 repo1 外的所有仓库

常用镜像源

镜像源地址
阿里云https://maven.aliyun.com/repository/public
华为云https://repo.huaweicloud.com/repository/maven/
腾讯云https://mirrors.cloud.tencent.com/nexus/repository/maven-public/

私服

什么是私服?

私服是架设在局域网内的 Maven 仓库,用于:

  • 代理外部仓库,加速下载
  • 存储企业内部构件
  • 统一管理依赖
  • 节省外网带宽

私服的优势

优势说明
加速构建从局域网下载,速度更快
节省带宽构件只需下载一次
稳定可靠不受外网影响
安全可控内部构件不外泄
统一管理集中管理依赖版本

Nexus 简介

Nexus 是最流行的 Maven 私服管理工具,由 Sonatype 开发。它提供了:

  • 仓库管理
  • 用户权限管理
  • 构件搜索
  • 构件代理

Nexus 仓库类型

Nexus 提供三种仓库类型:

类型说明
proxy代理仓库,代理外部仓库
hosted宿主仓库,存储本地构件
group仓库组,聚合多个仓库

安装 Nexus

使用 Docker 安装

# 拉取镜像
docker pull sonatype/nexus3

# 创建数据目录
mkdir -p /opt/nexus-data
chmod 777 /opt/nexus-data

# 启动容器
docker run -d \
--name nexus \
-p 8081:8081 \
-v /opt/nexus-data:/nexus-data \
sonatype/nexus3

访问 Nexus

安装完成后,访问 http://localhost:8081 进入 Nexus 管理界面。

默认管理员账号:

  • 用户名:admin
  • 密码:首次登录时会生成,存储在 /nexus-data/admin.password 文件中

配置 Nexus 仓库

创建代理仓库

  1. 登录 Nexus 管理界面
  2. 进入 Repository -> Repositories
  3. 点击 Create repository
  4. 选择 maven2 (proxy)
  5. 配置:

创建宿主仓库

  1. 点击 Create repository
  2. 选择 maven2 (hosted)
  3. 配置:
    • Name:my-releases
    • Version policy:Release
    • Deployment policy:Allow redeploy

创建仓库组

  1. 点击 Create repository
  2. 选择 maven2 (group)
  3. 配置:
    • Name:maven-public
    • Member repositories:添加需要的仓库

配置 Maven 使用私服

settings.xml 中配置:

<settings>
<!-- 配置镜像 -->
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>Nexus Mirror</name>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>

<!-- 配置服务器认证 -->
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>

<!-- 配置 Profile -->
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>

<!-- 激活 Profile -->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>

部署构件到私服

配置 pom.xml

<project>
...

<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>

注意:<id> 必须与 settings.xml<server><id> 一致。

部署命令

# 部署到私服
mvn deploy

# 跳过测试部署
mvn deploy -DskipTests

部署第三方构件

对于第三方构件(如 Oracle JDBC 驱动),可以使用以下命令手动部署:

mvn deploy:deploy-file \
-DgroupId=com.oracle \
-DartifactId=ojdbc8 \
-Dversion=19.3.0.0 \
-Dpackaging=jar \
-Dfile=ojdbc8-19.3.0.0.jar \
-DrepositoryId=nexus-releases \
-Durl=http://localhost:8081/repository/maven-releases/

仓库优先级

当配置了多个仓库时,Maven 按以下优先级查找构件:

  1. 本地仓库
  2. settings.xml 中的 profile 仓库
  3. pom.xml 中的仓库
  4. settings.xml 中的镜像
  5. 中央仓库

常见问题

问题一:下载速度慢

原因:使用国外中央仓库

解决:配置国内镜像源

问题二:无法下载 SNAPSHOT 依赖

原因:默认不更新 SNAPSHOT

解决

  1. 配置仓库启用 snapshots
  2. 使用 -U 参数强制更新
mvn package -U

问题三:私服认证失败

原因:server id 与 repository id 不匹配

解决:确保 settings.xml 中的 <server><id>pom.xml<repository><id> 一致

问题四:构件找不到

原因:构件不在配置的仓库中

解决

  1. 检查仓库配置是否正确
  2. 检查构件坐标是否正确
  3. 使用 mvn dependency:tree 分析依赖

小结

本章我们学习了:

  1. Maven 仓库的类型和查找顺序
  2. 本地仓库的配置和管理
  3. 远程仓库和镜像的配置
  4. 私服的概念和优势
  5. Nexus 的安装和配置
  6. 部署构件到私服的方法
  7. 仓库优先级和常见问题解决