概述

理论

不感兴趣的,可以直接可忽略。Nexus3,即nexus的3.*版本,功能已经非常强大,且支持很多语言和类型的仓库,以本文安装的3.29.2-02为例,支持:apt、bower、cocoapods、conan、conda、docker、gitlfs、go、helm、maven2、npm、nuget、p2、pypi、r、raw、rubygems、yum。

用户角色与权限

Nexus的调度任务

Nexus提供一系列可配置的调度任务来方便用户管理系统。用户可以设定这些任务运行的cron表达式。调度任务会在适当的时候在后台运行。要建立一个调度任务,单击左边导航菜单中的“Scheduled Tasks”,然后再右边的界面上单击Add按钮,按照页面上的提示填写相关内容。

Nexus包含以下几种类型的调度任务:

  • Download Indexs:为代理仓库下载远程索引
  • Empty Trash:清空Nexus的回收站,一些操作实际是将文件移到回收站中
  • Evict Unused Proxied Items From Repository Caches:删除代理仓库中长期未被使用的构件缓存
  • Expire Repository Cache:Nexus为代理仓库维护了远程仓库的信息以避免不必要的网络流量,该任务清空这些信息以强制Nexus去重新获取远程仓库的信息
  • Publish Indexs:将仓库索引发布成可供m2eclipse和其他Nexus使用的格式
  • Purge Nexus Timeline:删除Nexus的时间线文件,该文件用于建立系统的RSS源
  • Rebuild Maven Metadata Files:基于仓库内容重新创建仓库元数据文件​​maven-metadata.xml​​,同时重新创建每个文件的校验和md5与sha1
  • ReIndex Repositories:为仓库编纂索引
  • Remove Snapshots From Repositories:以可配置的方式删除仓库的快照构件
  • Synchronize Shadow Repository:同步虚拟仓库的内容(服务基于Maven1)

安装

下载压缩包文件:
​​​wget​​​ 解压:​​tar -zxvf nexus-3.29.2-02-unix.tar.gz​

移动到指定目录:​​mv nexus-3.29.2-02 /usr/local/nexus3​

配置浏览器访问的IP和端口号:​​vim /usr/local/nexus3/etc/nexus-default.properties​​​,将​​application-host=0.0.0.0​​​修改为​​application-host=<your_ip>​​,端口还是使用默认的8081。

切换到bin目录:​​cd /usr/local/nexus3/bin/​

启动:​​./nexus start​

此时应该就能打开浏览器访问刚才配置的地址:​​http://<ip>:8081​

如果不行,一般就是防火墙没有关,由于是内网搭建的私服,可放心关闭防火墙:​​systemctl stop firewalld​

设置为开机自启动:​​systemctl enable nexus​

若报错:
​​​Unit nexus.service could not be found.​

则创建连接到 /etc/init.d下:
​​​ln -s /usr/local/nexus3/bin/nexus /etc/init.d/nexus​

设置为开机启动:​​systemctl enable nexus​

输出:

nexus.service is not a native service, redirecting to systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable nexus

说明成功。

登录,默认的用户名是admin,密码存储在文件​​/usr/local/sonatype-work/nexus3/admin.password​​中,按照系统指引,可修改密码。

安装成功的界面:

CentOS 7/8搭建并配置Nexus3记录_依赖包

添加阿里云代理仓库

如图:

CentOS 7/8搭建并配置Nexus3记录_xml_02


可知,仓库类型有三种:

  • Hosted:本地仓库,可部署自己的构件到这类型的仓库。比如公司的第二方库;
  • Proxy:代理仓库,被用来代理远程的公共仓库,如maven中央仓库;
  • Group:仓库组,用来合并多个hosted/proxy仓库,当项目需要引用多个repository资源时,只需要将这些资源放到一个group中,引用这一个group即可;

注意得先登录:

CentOS 7/8搭建并配置Nexus3记录_依赖包_03


登录之后,才有配置权限:

CentOS 7/8搭建并配置Nexus3记录_xml_04


添加仓库:

CentOS 7/8搭建并配置Nexus3记录_xml_05


因为是添加阿里云代理仓库,故选择Proxy类型:

CentOS 7/8搭建并配置Nexus3记录_maven_06


有三个信息必须配置:

CentOS 7/8搭建并配置Nexus3记录_xml_07


第一个表示唯一性的名字,输入aliyun即可;

第一个是地址,既然是阿里云,输入http://maven.aliyun.com/nexus/content/groups/public/;

第三个是存储位置,点击下拉列表,选择default即可。

CentOS 7/8搭建并配置Nexus3记录_依赖包_08


至此,阿里云代理仓库添加成功,但是并不推荐直接使用,搭建nexus私服的目的并不仅仅只是把阿里云maven仓库的jar拷贝一份放在自己内网的私服仓库,这样并不能提升多少构建速度。

请继续往下看。

结合settings.xml

上面提到Hosted类型仓库,适用场景主要就是工程A需要引用工程B的jar,然后从内网的nexus私服仓库去下载。
因此我们还需要添加一个Hosted类型的仓库,和上面添加代理仓库步骤类似,只不过这个类型的仓库,只需要配置两个参数,一个表示仓库唯一性的名字和存储位置。

问题,为何Nexus提供Group类型的仓库?

试想:极少情况下,如果需要的jar包在阿里云找不到,是不是还需要添加其他地址的代理仓库,这样settings.xml配置文件是不是得添加好几个仓库镜像地址?

故此,引入Group类型的仓库。有三个必须填写的配置项,一个表示唯一性的名字和存储地址,以及下属仓库(Member repositories):

CentOS 7/8搭建并配置Nexus3记录_maven_09


效果图:

CentOS 7/8搭建并配置Nexus3记录_xml_10


左侧即为备选的仓库,右侧为选中的仓库,注意优先级顺序。最终效果图:

CentOS 7/8搭建并配置Nexus3记录_maven_11


选择group,点copy,得到形如:​​http://xxx:8081/repository/group/​​​的地址,放到​​settings.xml​​里即可:

<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>aliyun</name>
<url>http://xxx:8081/repository/group/</url>
</mirror>
</mirrors>

参考:​​使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库​​

目前,我们使用的 maven-public 组包括如下四个,其中 maven-releases, maven-snapshots,和 maven-central 是 Nexus 默认包含的。

CentOS 7/8搭建并配置Nexus3记录_xml_12

maven-central 是自带的 Proxy 类型,指向 https://repo1.maven.org/maven2/

aliyun-central是新增的 Proxy 类型,指向 https://maven.aliyun.com/repository/central

如上配置能满足绝大多数情况下(6个9,99.9999%)的依赖包下载。

上述配置能下载的依赖包,都能在 https://maven.aliyun.com/mvn/search 里面搜索到

之前使用一个 joda 包。

<dependency>
<groupId>org.joda.time</groupId>
<artifactId>joda</artifactId>
<version>2.3</version>
</dependency>

这玩意在阿里云搜不到:

CentOS 7/8搭建并配置Nexus3记录_xml_13


所以依赖下载失败。

解决方法:

使用正确的GAV:

<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.10</version>
</dependency>

手动上传,尤其适用于那些第三方私有SDK、API包

先学习一下 https://maven.aliyun.com/mvn/guide, 了解仓库的概念,知道除了maven官方仓库,还有jcenter,jboss等仓库。

比如,有些依赖包确实是在阿里云 central 里面搜不到,但是在 jcenter 里面有(下面的截图的例子不好,之前遇到过,暂时找不到满足条件的依赖包,即在 central 里面不存在,jcenter 里面存在的依赖包)

CentOS 7/8搭建并配置Nexus3记录_xml_14


解决方法:

  1. 手动下载,再上传,可行,因为确实没有必要使用下面的配置方法;真的很难遇到找不到依赖包的情况
  2. 把 jcenter 作为一个新的 Proxy repository 配置到我们的私服 Nexus,然后在 maven-public 里面包含新增的 jcenter 仓库。

配置JVM参数

切换到目录​​/usr/local/nexus3/bin​​​,有个​​nexus.vmoptions​​文件,和JVM启动参数、或者IDEA的JVM参考配置文件很类似。

Could not transfer artifact 401 Unauthorized

需在​​settings.xml​​里配置server标签,其中用户名密码是安装过程中设置的:

<servers>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>releases</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>

mvn ERROR xxx for default is missing

​mvn clean​​执行报错:

[ERROR] Error executing Maven.
[ERROR] 2 problems were encountered while building the effective settings
[ERROR] 'mirrors.mirror.url' for default is missing @ C:\Users\johnn\.m2\settings.xml
[ERROR] 'mirrors.mirror.mirrorOf' for default is missing @ C:\Users\johnn\.m2\settings.xml

原因是存在空的标签,删除即可:

<mirror>
</mirror>

上传到Nexus3私服

使用​​mvn deploy​​命名把本地的jar上传到nexus私服。

若报错:
​​​Failed to deploy artifacts: Could not transfer artifact XXX from/to releases (http://xxxx:8081/repository/maven-releases/) 400 Bad Request​

错误分析:
​​​mvn deploy​​在nexus3私服中已存在的jar包时出现400错误,原因是 release 默认库是不允许重复部署的,即默认是disable redeploy

解决方法:

登录到私服,找到报错的这个仓库,如​​maven-releases​​,并修改部署策略(Deployment policy)为Allow redeploy

CentOS 7/8搭建并配置Nexus3记录_maven_15

Failed to deploy artifacts: Could not transfer artifact from/to releases Transfer failed for 400 Repository does not allow updating assets: maven-releases -> [Help 1]

mvn deploy问题

was cached in the local repository, resolution will not be reattempted until

CentOS 7/8搭建并配置Nexus3记录_maven_16


解决方案:

修改​​settings.xml​​​文件,将其中的仓库添加​​<updatePolicy>always</updatePolicy>​​来强制每次都更新依赖库。删除无用repository

CentOS 7/8搭建并配置Nexus3记录_xml_17

参考

​​nexus私服配置​​