仓库与私服
Maven 仓库用于存储项目所需的构件和插件。本章将介绍 Maven 仓库的类型、配置方法以及私服的搭建和使用。
Maven 仓库概述
Maven 仓库是存放构件的地方。构件可以是 JAR 文件、WAR 文件、POM 文件或其他类型的文件。Maven 在构建项目时会从仓库中获取所需的依赖。
仓库的类型
Maven 仓库分为三种类型:
| 类型 | 说明 | 位置 |
|---|---|---|
| 本地仓库 | 开发者本机的仓库 | 默认 ~/.m2/repository |
| 远程仓库 | 网络上的仓库 | 如 Maven 中央仓库 |
| 私服 | 企业内部的仓库 | 局域网内部 |
仓库的查找顺序
Maven 查找构件的顺序:
- 本地仓库:如果本地仓库有,直接使用
- 远程仓库:如果本地没有,从远程仓库下载到本地
- 中央仓库:如果没有配置其他远程仓库,从中央仓库下载
本地仓库
默认位置
本地仓库默认位于用户主目录下的 .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 仓库
创建代理仓库
- 登录 Nexus 管理界面
- 进入
Repository->Repositories - 点击
Create repository - 选择
maven2 (proxy) - 配置:
- Name:aliyun-proxy
- URL:https://maven.aliyun.com/repository/public
- Blob store:default
创建宿主仓库
- 点击
Create repository - 选择
maven2 (hosted) - 配置:
- Name:my-releases
- Version policy:Release
- Deployment policy:Allow redeploy
创建仓库组
- 点击
Create repository - 选择
maven2 (group) - 配置:
- 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 按以下优先级查找构件:
- 本地仓库
- settings.xml 中的 profile 仓库
- pom.xml 中的仓库
- settings.xml 中的镜像
- 中央仓库
常见问题
问题一:下载速度慢
原因:使用国外中央仓库
解决:配置国内镜像源
问题二:无法下载 SNAPSHOT 依赖
原因:默认不更新 SNAPSHOT
解决:
- 配置仓库启用 snapshots
- 使用
-U参数强制更新
mvn package -U
问题三:私服认证失败
原因:server id 与 repository id 不匹配
解决:确保 settings.xml 中的 <server> 的 <id> 与 pom.xml 中 <repository> 的 <id> 一致
问题四:构件找不到
原因:构件不在配置的仓库中
解决:
- 检查仓库配置是否正确
- 检查构件坐标是否正确
- 使用
mvn dependency:tree分析依赖
小结
本章我们学习了:
- Maven 仓库的类型和查找顺序
- 本地仓库的配置和管理
- 远程仓库和镜像的配置
- 私服的概念和优势
- Nexus 的安装和配置
- 部署构件到私服的方法
- 仓库优先级和常见问题解决