概述
理论
不感兴趣的,可以直接可忽略。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
输出:
说明成功。
登录,默认的用户名是admin,密码存储在文件/usr/local/sonatype-work/nexus3/admin.password
中,按照系统指引,可修改密码。
安装成功的界面:
添加阿里云代理仓库
如图:
可知,仓库类型有三种:
- Hosted:本地仓库,可部署自己的构件到这类型的仓库。比如公司的第二方库;
- Proxy:代理仓库,被用来代理远程的公共仓库,如maven中央仓库;
- Group:仓库组,用来合并多个hosted/proxy仓库,当项目需要引用多个repository资源时,只需要将这些资源放到一个group中,引用这一个group即可;
注意得先登录:
登录之后,才有配置权限:
添加仓库:
因为是添加阿里云代理仓库,故选择Proxy类型:
有三个信息必须配置:
第一个表示唯一性的名字,输入aliyun即可;
第一个是地址,既然是阿里云,输入http://maven.aliyun.com/nexus/content/groups/public/;
第三个是存储位置,点击下拉列表,选择default即可。
至此,阿里云代理仓库添加成功,但是并不推荐直接使用,搭建nexus私服的目的并不仅仅只是把阿里云maven仓库的jar拷贝一份放在自己内网的私服仓库,这样并不能提升多少构建速度。
请继续往下看。
结合settings.xml
上面提到Hosted类型仓库,适用场景主要就是工程A需要引用工程B的jar,然后从内网的nexus私服仓库去下载。
因此我们还需要添加一个Hosted类型的仓库,和上面添加代理仓库步骤类似,只不过这个类型的仓库,只需要配置两个参数,一个表示仓库唯一性的名字和存储位置。
问题,为何Nexus提供Group类型的仓库?
试想:极少情况下,如果需要的jar包在阿里云找不到,是不是还需要添加其他地址的代理仓库,这样settings.xml配置文件是不是得添加好几个仓库镜像地址?
故此,引入Group类型的仓库。有三个必须填写的配置项,一个表示唯一性的名字和存储地址,以及下属仓库(Member repositories):
效果图:
左侧即为备选的仓库,右侧为选中的仓库,注意优先级顺序。最终效果图:
选择group,点copy,得到形如:http://xxx:8081/repository/group/
的地址,放到settings.xml
里即可:
参考:使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
目前,我们使用的 maven-public 组包括如下四个,其中 maven-releases, maven-snapshots,和 maven-central 是 Nexus 默认包含的。
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 包。
这玩意在阿里云搜不到:
所以依赖下载失败。
解决方法:
使用正确的GAV:
手动上传,尤其适用于那些第三方私有SDK、API包
先学习一下 https://maven.aliyun.com/mvn/guide, 了解仓库的概念,知道除了maven官方仓库,还有jcenter,jboss等仓库。
比如,有些依赖包确实是在阿里云 central 里面搜不到,但是在 jcenter 里面有(下面的截图的例子不好,之前遇到过,暂时找不到满足条件的依赖包,即在 central 里面不存在,jcenter 里面存在的依赖包)
解决方法:
- 手动下载,再上传,可行,因为确实没有必要使用下面的配置方法;真的很难遇到找不到依赖包的情况
- 把 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标签,其中用户名密码是安装过程中设置的:
mvn ERROR xxx for default is missing
mvn clean
执行报错:
原因是存在空的标签,删除即可:
上传到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:
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
解决方案:
修改settings.xml
文件,将其中的仓库添加<updatePolicy>always</updatePolicy>
来强制每次都更新依赖库。删除无用repository
参考
nexus私服配置