一、核心理念:为什么需要 Nexus?
在现代 Java 开发和 CI/CD 流程中,直接依赖公共 Maven 中央仓库(Maven Central)会带来诸多问题。使用 Nexus 作为私有制品库,旨在解决以下痛点:
- 速度与稳定性:通过代理和缓存公共依赖,将下载从慢速、不稳定的外网转移到高速、可靠的内网,极大加速构建过程,并避免因外网问题导致的构建失败。
- 私有依赖管理:为公司内部开发的公共组件、工具包(私有 Jar 包)提供一个集中、安全、版本化的存储和分发平台。
- 构建的可重复性:确保无论何时何地,只要
pom.xml文件不变,项目拉取到的依赖版本都是完全一致的,尤其是对于快照版(SNAPSHOT)的管理。 - 安全与合规:统一管理所有外部依赖的来源,便于进行安全扫描和合规审计,避免直接从不受信任的源拉取依赖。
- 简化配置:通过仓库组 (Group) 提供单一的访问入口,让开发人员和 CI/CD 工具的配置变得极其简单。
二、Nexus 仓库的三种核心类型
Nexus 通过三种仓库协同工作,完美解决公有和私有依赖的管理问题。
| 仓库类型 | 作用 | 形象比喻 |
|---|---|---|
| 代理 (Proxy) | 代理外部公共仓库(如 Maven Central),并缓存下载过的依赖。 | 公司的“快递代收点”,收一次快递后就存放在本地,下次直接取。 |
| 宿主 (Hosted) | 存储和管理公司内部开发的私有依赖(Jar 包)。 | 公司的“内部仓库”,存放自己生产的产品。 |
| 仓库组 (Group) | 将多个代理和宿主仓库聚合成一个单一的访问 URL。 | 公司的“总调度中心”,你只需要找它,它会自动帮你从代收点或内部仓库取货。 |
三、实践操作:一步一步创建 Maven 仓库体系
目标:创建一套企业级的 Maven 仓库,分离正式版和快照版,并通过一个统一的组来访问。
步骤 1:创建 Maven 中央仓库的代理 (Proxy Repository)
- 目的:缓存所有从外网下载的公共依赖。
- 操作:
- 登录 Nexus -> ⚙️ Server Administration -> Repositories -> Create repository。
- 选择配方
maven2 (proxy)。 - 填写配置:
- Name:
maven-central-proxy - Remote storage:
https://repo1.maven.org/maven2/(Maven Central 官方地址) - Version policy:
Release(因为 Maven Central 只存放正式版)
- Name:
- 点击 Create repository 保存。
步骤 2:创建私有依赖的宿主仓库 (Hosted Repositories)
-
目的:严格分离稳定可发布的正式版和开发中的快照版,这是保证构建可靠性的核心安全机制。
-
操作 A:创建
maven-releases(存放正式版)- Create repository -> 选择
maven2 (hosted)。 - 填写配置:
- Name:
maven-releases - Version policy:
Release(只接受正式版) - Deployment policy:
Disable redeploy( 极其重要! 禁止覆盖同版本的正式包,保证其不可变性)
- Name:
- 保存。
- Create repository -> 选择
-
操作 B:创建
maven-snapshots(存放快照版)- Create repository -> 选择
maven2 (hosted)。 - 填写配置:
- Name:
maven-snapshots - Version policy:
Snapshot(只接受快照版) - Deployment policy:
Allow redeploy(允许开发过程中覆盖不稳定的快照版本)
- Name:
- 保存。
- Create repository -> 选择
步骤 3:创建聚合所有仓库的仓库组 (Group Repository)
- 目的:提供一个统一的 URL 给所有 Maven 用户。
- 操作:
- Create repository -> 选择
maven2 (group)。 - 填写配置:
- Name:
maven-public-group(或任何你喜欢的名字)
- Name:
- 添加成员 (Members):
- 将右侧 Available 列表中的
maven-releases,maven-snapshots,maven-central-proxy添加到左侧的 Members 列表中。
- 将右侧 Available 列表中的
- 调整顺序 (非常重要!):
- 使用上下箭头,确保查找顺序为:
maven-releases(优先查找内部正式版)maven-snapshots(其次查找内部快照版)maven-central-proxy(最后去代理仓库找公共版)
- 使用上下箭头,确保查找顺序为:
- 保存。
- Create repository -> 选择
四、配置与使用:将 Maven 连接到 Nexus
1. 获取 Nexus 仓库组 URL
- 在 Nexus Repositories 列表中,点击你创建的仓库组(如
maven-public-group),复制其 URL。这个地址是后续所有配置的唯一入口。- 示例 URL:
https://your-nexus-server.com/repository/maven-public-group/
- 示例 URL:
2. 配置本地 settings.xml
- 文件位置:
~/.m2/settings.xml(用户主目录下的.m2文件夹内)。 - 核心配置:这个文件负责告诉 Maven 去哪里下载依赖以及上传时的认证信息。
settings.xml 完整配置模板:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- A. 如果你的构建环境能上网,但 Nexus 不能 -->
<!-- 使用 Profile 方式,让 Maven 自己去外网下载公共库 -->
<profiles>
<profile>
<id>nexus-profile</id>
<repositories>
<repository>
<id>nexus-group</id>
<name>Internal Nexus Group</name>
<url>https://your-nexus-server.com/repository/maven-public-group/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-group</id>
<name>Internal Nexus Group for Plugins</name>
<url>https://your-nexus-server.com/repository/maven-public-group/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus-profile</activeProfile>
</activeProfiles>
<!-- B. 如果你的 Nexus 和构建环境都能上网 (或都在纯内网) -->
<!-- 使用 Mirror 方式,强制所有流量都通过 Nexus -->
<mirrors>
<mirror>
<id>nexus-mirror</id>
<!-- * 号代表拦截所有请求 -->
<mirrorOf>*</mirrorOf>
<name>Internal Nexus Mirror</name>
<url>https://your-nexus-server.com/repository/maven-public-group/</url>
</mirror>
</mirrors>
<!-- C. 认证信息 (无论哪种方式都需要) -->
<servers>
<server>
<!-- 这个 id 用于匹配 mvn deploy 命令或 pom.xml 中的 distributionManagement -->
<id>maven-releases</id>
<username>your-deploy-user</username>
<password>your-deploy-password</password>
</server>
<server>
<id>maven-snapshots</id>
<username>your-deploy-user</username>
<password>your-deploy-password</password>
</server>
</servers>
</settings>
注意:通常选择 A 或 B 一种方式即可。B (Mirror) 是最常见、最能发挥 Nexus 缓存优势的方式。A (Profile) 适用于你的构建机能上网但 Nexus 本身是离线代理的特殊场景。
3. 配置项目 pom.xml (用于发布)
- 目的:告诉 Maven
deploy命令应该将构建好的 Jar 包上传到哪个具体的宿主仓库。 - 配置:在项目的
pom.xml文件中添加distributionManagement标签。
<project>
...
<distributionManagement>
<repository>
<!-- 这个 id 必须和 settings.xml 中 server 的 id 完全匹配 -->
<id>maven-releases</id>
<name>Internal Releases Repository</name>
<!-- URL 指向具体的宿主仓库,而不是组 -->
<url>https://your-nexus-server.com/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>maven-snapshots</id>
<name>Internal Snapshots Repository</name>
<url>https://your-nexus-server.com/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
...
</project>
4. 上传私有 Jar 包到 Nexus
- 场景:当需要将一个第三方的、或历史遗留的 Jar 包手动上传到 Nexus 时。
- 命令:使用
mvn deploy:deploy-file命令。
上传带 JAR 和 POM 的构件:
mvn deploy:deploy-file \
-Durl=https://your-nexus-server.com/repository/maven-releases/ \
-DrepositoryId=maven-releases \
-DgroupId=com.example \
-DartifactId=my-library \
-Dversion=1.0.0 \
-Dpackaging=jar \
-Dfile=/path/to/my-library-1.0.0.jar \
-DpomFile=/path/to/my-library-1.0.0.pom
-DrepositoryId的值必须与settings.xml中<server>的<id>严格对应,Maven 才能找到正确的用户名和密码。
上传只有 POM 的父构件:
mvn deploy:deploy-file \
-Durl=https://your-nexus-server.com/repository/maven-releases/ \
-DrepositoryId=maven-releases \
-DgroupId=com.example \
-DartifactId=my-parent \
-Dversion=1.0.0 \
-Dpackaging=pom \
-Dfile=/path/to/my-parent-1.0.0.pom
这篇笔记涵盖了从理论到实战的完整流程,希望能帮助你更好地理解和使用 Nexus 来管理 Java 项目。
3688

被折叠的 条评论
为什么被折叠?



