# Nexus私服配置
## 引言
私服是一种私有服务器,是在局域网中搭建的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构建,私服搭建成功之后,当maven需要下载构件时,直接请求私服。私服上存在则下载到本地仓库,不存在才请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载,可以减少重复网络流量下载问题。
![img](https://s2.loli.net/2022/05/17/ns24XmNMCghlR3Q.png)
作为普通个人开发者(初学者或者小规模开发),使用`maven`下载构件都是Maven中央仓库或者第三方仓库下载,基本用不到私服。那什么时候需要用到私服?答案:大规模团队开发。其实每一项技术的诞生,都是由于生产规模再扩大而导致新问题产生,需要相应的技术解决。需要进行私服配置,就是为在大规模团队开发中优化构建处理工作。
### 1、如果没有搭建私服会有什么问题?
- 如果没有私服,我们所需的所有构件都需要通过 **Maven** 的中央仓库或者第三方的 **Maven** 仓库下载到本地,而一个团队中的所有人都重复的从 **Maven** 仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,还会影响项目的进程。
- 另外,很多情况下项目的开发都是在内网进行的,可能根本连接不了 **Maven** 的中央仓库和第三方的 **Maven** 仓库。
- 我们开发的公共构件如果需要提供给其它项目使用,也需要搭建私服。
### 2,搭建私服的优点
**Maven** 私服的概念就是在本地架设一个 **Maven** 仓库服务器,在代理远程仓库的同时维护本地仓库。当我们需要下载一些构件(**artifact**)时,如果本地仓库没有,再去私服下载,私服没有,再去中央仓库下载。这样做会有如下一些优点:
- 减少网络带宽流量
- 加速 **Maven** 构建
- 部署第三方构件
- 提高稳定性、增强控制
- 降低中央仓库的负载
### 3、Nexus 介绍
**Nexus** 是一个专门的 **Maven** 仓库管理软件,它不仅能搭建 **Maven** 私服,还具备如下一些优点使其日趋成为最流行的 **Maven** 仓库管理器:
- 提供了强大的仓库管理功能,构件搜索功能
- 它基于 **REST**,友好的 **UI** 是一个 **ext.js** 的 **REST** 客户端
- 它占用较少的内存
- 基于简单文件系统而非数据库
## Nexus安装
### Windows
1.下载地址:https://www.sonatype.com/download-oss-sonatype,例如: nexus-3.20.1-01-win64。
> PS:从官网下载超级慢,建议从别人百度网盘下载。自行百度即可。
2.解压到响应文件夹下,得到:sonatype-work和nexus-3.20.1 例如:D:\
![image-20220514111527484](https://s2.loli.net/2022/05/17/gzYbLWwQTsl9pj1.png)
3.进行环境配置。配置为系统环境变量,编辑path,添加D:\nexus-3.20.1\bin。
4.使用**管理员权限**操作 Windows PowerShell。操作如下:
```bash
# 第一步 安装
nexus.exe / install
# 第一步 启动
nexus.exe / start
# 搞定 访问http://localhost:8081即可
```
后续:如果需要停止、重启,参考如下命令。
```
/install:安装
/uninstall:卸载
/stop:停止后台运行
/start:后台运行
/status:查看运行状态
/run:前台运行,可在cmd命令行查看log
```
### Linux
1.从官网下载到压缩包,并上传到服务器(比如 **/usr/local** 目录下),然后进行解压
```bash
tar -zxf nexus-3.21.2-03-unix.tar.gz
```
2.解压后会得到两个文件夹:**nexus-3.21.2-03**(**nexus** 服务目录)、**sonatype-work**(私有库目录)
3.然后执行如下命令开放 **8081** 端口:
```bash
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload
```
4.最后执行如下命令启动服务即可:
```bash
cd bin
./nexus start
```
5.访问 服务器IP+8081端口 即可。
### Docker
(1)首先执行如下命令下载 **Nexus3** 镜像:
```
docker pull sonatype/nexus3
```
(2)接着执行如下命令,创建宿主机挂载目录:
```
mkdir –vp /usr/local/nexus-data
```
(3)最后执行如下命令运行 **Nexus3** 容器即可:
```bash
docker run -d --name nexus3 -p 8081:8081 -v /usr/local/nexus-data:/var/nexus-data sonatype/nexus3
```
(4)同样不要忘记执行如下命令开放 **8081** 端口:
```bash
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload
```
访问镜像IP地址+8081端口即可访问。
如果想使用其他的端口访问(比如8068,我的本机地址8081端口被其他服务占用),直接修改**nexus-default.properties** 配置文件。
```properties
## DO NOT EDIT - CUSTOMIZATIONS BELONG IN $data-dir/etc/nexus.properties
##
# Jetty section
application-port=8068
application-host=0.0.0.0
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
nexus-context-path=/
# Nexus section
nexus-edition=nexus-pro-edition
nexus-features=\
nexus-pro-feature
nexus.hazelcast.discovery.isEnabled=true
```
重启`nexus`即可,再访问IP+8068端口。
![image-20220514122437026](https://s2.loli.net/2022/05/14/dCBuOZt15fshl6P.png
需要说的是,不建议在自己Windows系统电脑上一直挂载`Nexus`,占用大量内存。还是建议放到远程服务器上。还有一点,第一次登录,在新版Nexus中,用户密码不再是默认admin123。在系统某个文件夹中(不记得自行百度)
## 使用Nexus
> PS:网上的教程关于这一部分说明十分详细,就不详细介绍。这里概要提一下。
#### 1、创建自己的用户
例如:qianye/123456,并授予权限。
![image-20220514123532552](https://s2.loli.net/2022/05/14/jcGvMbCrduEVOlW.png)
#### 2、创建自己的仓库
![image-20220514123912110](https://s2.loli.net/2022/05/14/sZnljicPDw2xb1I.png)
#### Nexus仓库类型介绍:
- hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
- proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
- group,仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。
#### 管理本地仓库:
我们前面讲到类型为hosted的为本地仓库,Nexus预定义了3个本地仓库,分别是Releases, Snapshots, 3rd Party. 分别讲一下这三个预置的仓库都是做什么用的:
- Releases: 这里存放我们自己项目中发布的构建, 通常是Release版本的, 比如我们自己做了一个FTP Server的项目, 生成的构件为ftpserver.war, 我们就可以把这个构建发布到Nexus的Releases本地仓库. 关于符合发布后面会有介绍.
- Snapshots:这个仓库非常的有用, 它的目的是让我们可以发布那些非release版本, 非稳定版本, 比如我们在trunk下开发一个项目,在正式release之前你可能需要临时发布一个版本给你的同伴使用, 因为你的同伴正在依赖你的模块开发, 那么这个时候我们就可以发布Snapshot版本到这个仓库, 你的同伴就可以通过简单的命令来获取和使用这个临时版本.
- 3rd Party:顾名思义, 第三方库, 你可能会问不是有中央仓库来管理第三方库嘛,没错, 这里的是指可以让你添加自己的第三方库, 比如有些构件在中央仓库是不存在的. 比如你在中央仓库找不到Oracle 的JDBC驱动, 这个时候我们就需要自己添加到3rdparty仓库。
不过我要说的是,Nexus不仅仅能搭建Maven仓库,还包括`docker`、`apt`、`npm`、`pypi`等仓库。
![image-20220514124552749](https://s2.loli.net/2022/05/14/oPAhBEX81WrsuT4.png)
安装成功后,自己多摸索,百度就会使用。
# 附录1
### Maven 配置使用私服(下载依赖)
#### 1、基本说明
(1)**Maven** 配置私服下载有两种方式:
- **setting.xml**:该文件配置的是全局模式
- **pom.xml**:该文件的配置的是项目独享模式
**注意**:若 **pom.xml** 和 **setting.xml** 同时配置了,以 **pom.xml** 为准。
(2)当我们在 **maven** 使用 **maven-public** 仓库地址的时候,会按照如下顺序访问:**本地仓库** --> **私服 maven-releases** --> **私服 maven-snapshots** --> **远程阿里云 maven 仓库** --> **远程中央仓库**。
#### 2、通过 setting.xml 文件配置
(1)**setting.xml** 文件配置样例如下。配置后不需要再配置 **pom.xml** 文件,即可通过私服下载 **jar** 依赖包。
```xml
<mirrors>
<mirror>
<!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>nexus-releases</id>
<!--*指的是访问任何仓库都使用我们的私服-->
<mirrorOf>*</mirrorOf>
<!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://localhost:8068/repository/maven-public/</url>
</mirror>
</mirrors>
```
(2)如果我们并没有搭建私服,属于个人开发,那么也可以直接配置使用阿里 云**maven** 仓库:
```xml
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
```
#### 3、通过 pom.xml 文件配置
(1)**pom.xml** 文件配置样例如下。如果我们配置了 **pom.xml**,则以 **pom.xml** 为准。
```xml
<repositories>
<repository>
<id>maven-nexus</id>
<name>maven-nexus</name>
<url>http://192.168.60.133:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
```
(2)如果没有私服,我们同样也可以配置阿里云 **maven** 仓库:
```xml
<repositories>
<repository>
<id>maven-aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
```
#### 4、Maven 配置使用私服(下载插件)
下面是一个使用 **pom.xml** 配置样例:
```xml
<pluginRepositories>
<pluginRepository>
<id>maven-nexus</id>
<name>maven-nexus</name>
<url>http://10.172.0.201:8081/nexus/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
```
#### 5、Maven 配置使用私服(发布依赖)
(1)首先修改 **setting.xml** 文件,指定 **releases** 和 **snapshots server** 的用户名和密码:
```xml
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>123</password>
</server>
</servers>
```
(2)接着在项目的 **pom.xml** 文件中加入 **distributionManagement** 节点:
**注意**:**repository** 里的 **id** 需要和上一步里的 **server id** 名称保持一致。
```xml
<distributionManagement>
<repository>
<id>releases</id>
<name>Releases</name>
<url>http://192.168.60.133:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshot</name>
<url>http://192.168.60.133:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
```
(3)执行 **mvn deploy** 命令发布:
[![原文:使用Nexus搭建Maven私服教程(附:配置并使用私服教程)](https://www.hangge.com/blog_uploads/202003/2020032516583089172.png)](https://www.hangge.com/blog/cache/detail_2844.html#)
(4)登录 **Nexus**,查看对应的仓库已经有相关的依赖包了。
**发布到的仓库说明:**
- 若项目版本号末尾带有 **-SNAPSHOT**,则会发布到 **snapshots** 快照版本仓库
- 若项目版本号末尾带有 **-RELEASES** 或什么都不带,则会发布到 **releases** 正式版本仓库
[![原文:使用Nexus搭建Maven私服教程(附:配置并使用私服教程)](https://www.hangge.com/blog_uploads/202003/2020032517012275075.png)](https://www.hangge.com/blog/cache/detail_2844.html#)
# 附录2
我的本地Maven之Settings.xml配置,完整配置如下:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
</pluginGroups>
<proxies>
</proxies>
<!-- servers
| This is a list of authentication profiles, keyed by the server-id used within the system.
| Authentication profiles can be used whenever maven must make a connection to a remote server.
|-->
<servers>
<server>
<id>releases</id>
<username>qianye</username>
<password>123456</password>
</server>
<server>
<id>snapshots</id>
<username>qianye</username>
<password>123456</password>
</server>
</servers>
<mirrors>
<mirror>
<!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>nexus-releases</id>
<!--*指的是访问任何仓库都使用我们的私服-->
<mirrorOf>*</mirrorOf>
<!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://localhost:8068/repository/maven-public/</url>
</mirror>
<mirror>
<id>nexus-snapshots</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8068/repository/maven-snapshots/</url>
</mirror>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<!--profile的id-->
<id>nexus</id>
<repositories>
<repository>
<!--仓库id,repositories可以配置多个仓库,保证id不重复-->
<id>nexus-releases</id>
<!--仓库地址,即nexus仓库组的地址-->
<url>http://nexus-releases</url>
<releases>
<!--是否下载releases构件-->
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>nexus-snapshots</id>
<url>http://nexus-snapshots</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository>
<!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>nexus-releases</id>
<url>http://nexus-releases</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>nexus-snapshots</id>
<url>http://nexus-snapshots</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!--激活profile-->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
```
我某个项目中的`pom.xml`文件配置
```xml
<distributionManagement>
<repository>
<id>releases</id>
<name>Releases</name>
<url>http://localhost:8068/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshot</name>
<url>http://localhost:8068/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
```
## 参考教程
[教程一](https://www.cnblogs.com/wuzhenzhao/p/13307444.html)
[教程二](https://www.hangge.com/blog/cache/detail_2844.html)
[教程三](https://www.jianshu.com/p/6c4a4bf33a47)
Nexus私服搭建记录