概述
理论
不感兴趣的,可以直接可忽略。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表达式,支持手写cron表达式,前提是cron表达式的合法性:
调度任务会在指定时间在后台运行,当然建议放在深夜执行。
以管理员账户登录,点击左侧导航菜单中的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
中,按照系统指引,可修改密码。
安装成功的界面:
实战
添加阿里云代理仓库
如图:
可知,仓库类型有三种:
- 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
里即可:
<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 默认包含的。
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>
这玩意在阿里云搜不到:
所以依赖下载失败。
解决方法:
使用正确的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 里面存在的依赖包)
解决方法:
- 手动下载,再上传,可行,因为确实没有必要使用下面的配置方法;真的很难遇到找不到依赖包的情况
- 把 jcenter 作为一个新的 Proxy repository 配置到我们的私服 Nexus,然后在 maven-public 里面包含新增的 jcenter 仓库。
配置JVM参数
切换到目录/usr/local/nexus3/bin
,有个nexus.vmoptions
文件,和JVM启动参数、或者IDEA的JVM参考配置文件很类似。
删除
本地开发时一般会使用SNAPSHOT快照版本号。不管是在本地执行mvn deploy
,将本地已经提交或未提交的代码编译打包并部署上传到nexus私服,还是Jenkins等构建工具基于GitLab(或GitHub)将已提交的代码打包上传到nexus私服,都会覆盖之前的SNAPSHOT版本。
那就不可避免会出现最后一个SNAPSHOT版本号有误,解决方法:
- 以正确的代码为准,执行
mvn deploy
再次覆盖错误的版本; - 删除最后一次错误的版本
说到删除构建产物artifact,以nexus管理员账户登录,点击Browse,找到想要删除的artifact,点击删除即可。
要注意的是,不能从maven-public 这种public Type进入
而应该从hosted Type托管类型进入
问题
需在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:
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 the update interval of nexus has elapsed or updates are forced and points at wrong local POM
解决方案:
修改settings.xml
文件,将其中的仓库添加<updatePolicy>always</updatePolicy>
来强制每次都更新依赖库。
删除无用repository
参考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142245.html