# Nexus 运维
> Nexus 是一个强大的 Maven 仓库管理器,可以用来搭建 Maven 私服。
>
> 关键词:maven, nexus
>
> 部署环境
>
> - Nexus 3.13.0
> - JDK 1.8
> - Maven 3.5.4
- [安装 Nexus](#安装-nexus)
- [启动/停止 Nexus](#启动停止-nexus)
- [使用 Nexus 搭建 Maven 私服](#使用-nexus-搭建-maven-私服)
- [配置仓库](#配置仓库)
- [配置 settings.xml](#配置-settingsxml)
- [配置 pom.xml](#配置-pomxml)
- [执行 maven 构建](#执行-maven-构建)
- [将 Nexus 设置为服务](#将-nexus-设置为服务)
- [Nexus 备份和迁移](#nexus-备份和迁移)
- [备份](#备份)
- [迁移](#迁移)
- [参考资料](#参考资料)
## 安装 Nexus
进入[官方下载地址](https://www.sonatype.com/download-oss-sonatype),选择合适版本下载。
本人希望将 Nexus 部署在 Linux 机器,所以选用的是 Unix 版本。
这里,如果想通过命令方式直接下载(比如用脚本安装),可以在[官方历史发布版本页面](https://help.sonatype.com/repomanager3/download/download-archives---repository-manager-3)中找到合适版本,然后执行以下命令:
```sh
wget -O /opt/maven/nexus-unix.tar.gz http://download.sonatype.com/nexus/3/nexus-3.13.0-01-unix.tar.gz
tar -zxf nexus-unix.tar.gz
```
解压后,有两个目录:
- nexus-3.13.0-01 - 包含了 Nexus 运行所需要的文件。是 Nexus 运行必须的。
- sonatype-work - 包含了 Nexus 生成的配置文件、日志文件、仓库文件等。当我们需要备份 Nexus 的时候默认备份此目录即可。
## 启动/停止 Nexus
进入 nexus-3.13.0-01/bin 目录,有一个可执行脚本 nexus。
执行 `./nexus`,可以查看允许执行的参数,如下所示,含义可谓一目了然:
```sh
$ ./nexus
Usage: ./nexus {start|stop|run|run-redirect|status|restart|force-reload}
```
- 启动 nexus - `./nexus start`
- 停止 nexus - `./nexus stop`
- 重启 nexus - `./nexus restart`
启动成功后,在浏览器中访问 `http://:8081`,欢迎页面如下图所示:
点击右上角 Sign in 登录,默认用户名/密码为:admin/admin123。
## 使用 Nexus 搭建 Maven 私服
### 配置仓库
Nexus 中的仓库有以下类型:
- `hosted` - 宿主仓库。主要用于部署无法从公共仓库获取的构件(如 oracle 的 JDBC 驱动)以及自己或第三方的项目构件;
- `proxy` - 代理仓库。代理公共的远程仓库;
- `virtual` - 虚拟仓库。用于适配 Maven 1;
- `group` - 仓库组。Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。
> **最佳实践**
>
> 建议配置如下:
>
> - hosted 仓库
> - maven-releases - 存储私有仓库的发行版 jar 包
> - maven-snapshots - 存储私有仓库的快照版(调试版本) jar 包
> - proxy 仓库
> - maven-central - maven 中央库(如果没有配置 mirror,默认就从这里下载 jar 包),从 https://repo1.maven.org/maven2/ 获取资源
> - maven-aliyun - 国内 maven 仓库,提高访问速度。
> - group 仓库
> - maven-public - 私有仓库的公共空间,把上面三个仓库组合在一起对外提供服务,在本地 maven 基础配置 settings.xml 中使用。
### 配置 settings.xml
如果要使用 Nexus,还必须在 settings.xml 和 pom.xml 中配置认证信息。
一份完整的 `settings.xml`:
```xml
org.sonatype.plugins
releases
admin
admin123
snapshots
admin
admin123
public
*
http://10.255.255.224:8081/repository/maven-public/
zp
central
http://central
true
true
central
http://central
true
true
always
zp
```
### 配置 pom.xml
在 pom.xml 中添加如下配置:
```xml
releases
Releases
http://10.255.255.224:8081/repository/maven-releases
snapshots
Snapshot
http://10.255.255.224:8081/repository/maven-snapshots
```
> 注意:
>
> - `` 和 `` 的 id 必须和 `settings.xml` 配置文件中的 `` 标签中的 id 匹配。
> - `` 标签的地址需要和 maven 私服的地址匹配。
### 执行 maven 构建
如果要使用 settings.xml 中的私服配置,必须通过指定 `-P zp` 来激活 profile。
示例:
```sh
# 编译并打包 maven 项目
$ mvn clean package -Dmaven.skip.test=true -P zp
# 编译并上传 maven 交付件(jar 包)
$ mvn clean deploy -Dmaven.skip.test=true -P zp
```
## 将 Nexus 设置为服务
将 Nexus 添加为服务,以便开机自启动。
在 `/lib/systemd/system` 目录下创建 `nexus.service` 文件,内容如下:
```ini
[Unit]
Description=nexus
After=network.target
[Service]
Type=forking
LimitNOFILE=65536 #警告处理
Environment=RUN_AS_USER=root
ExecStart=/opt/maven/nexus-3.13.0-01/bin/nexus start
ExecReload=/opt/maven/nexus-3.13.0-01/bin/nexus restart
ExecStop=/opt/maven/nexus-3.13.0-01/bin/nexus stop
Restart=on-failure
PrivateTmp=true
[Install]
WantedBy=multi-user.target
```
保存后,可以使用以下命令应用 nexus 服务:
- `systemctl enable nexus` - 启动 nexus 开机启动
- `systemctl disable nexus` - 关闭 nexus 开机启动
- `systemctl start nexus` - 启动 nexus 服务
- `systemctl stop nexus` - 停止 nexus 服务
- `systemctl restart nexus` - 重启 nexus 服务
## Nexus 备份和迁移
Nexus 三个重要目录:
| 名称 | 目录名 | 重要配置文件 |
| :----------------- | :------------- | :------------------------------------------------ |
| nexus 主目录 | nexus-2.6.4-02 | conf/nexus.properties 里面有 sonatype-work 的地址 |
| sonatype-work 目录 | sonatype-work | nexus/conf/nexus.xml 里面有 storage 的地址 |
| storage 目录 | storage | 里面主要是各种程序的 jar 包等 |
### 备份
Nexus 的数据都存储在 sonatype-work 目录,备份 Nexus 数据只需要将其打包即可。
### 迁移
将原 Nexus 服务器中的 sonatype-work 目录迁移到新 Nexus 服务器的 sonatype-work 目录下。
## 参考资料
- [maven 私库 nexus3 安装及使用](https://blog.csdn.net/clj198606061111/article/details/52200928)
- [Nexus 安装 使用说明](https://www.cnblogs.com/jtlgb/p/7473837.html)
- [企业级开源仓库 nexus3 实战应用–使用 nexus3 配置 yum 私有仓库](http://www.eryajf.net/2002.html)