Nexus是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库下载所需要的构件(artifact),但这通常不是一个好的做法。应该在本地架设一个Maven仓库服务器,还提供了强大的仓库管理功能,构件搜索功能,占用较少的内存,基于简单文件系统,而非数据库。这些优点使其日趋成为最流行的Maven仓库管理器。
Nexus可以代理远程仓库的同时维护本地仓库,以节省带宽和时间,
Nexus不是Maven的核心概念,它仅仅是一种衍生出来的特殊的Maven仓库。也可以理解为jar的缓存服务器
对于Maven来说,仓库只有两种:本地和远程
本地仓库就是我们在Maven的settings.xml中配置的本地仓库地址。由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。
中央仓库是Maven默认的远程仓库。
私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当Maven需要下载构件时,直接请求私服,私服上存在则下载到本地仓库,否则,私服请求外部的远程仓库,将构件下载到私服,在提供给本地仓库下载。
适用于Maven场景较多的情况下,如果只有一个Maven的话,不适用架设Nexus私服,一个就直接使用 aliyun 仓库就挺好了
Nexus功能介绍
1、节省外网带宽。大量对于外部仓库的重复请求会消耗带宽,利用私服代理外部仓库,可以消除对外的重复构件下载,降低带宽的压力。
2、加速Maven构建。不停地连接请求外部仓库十分的耗时,Maven在执行构建的时候不停地检查远程仓库的数据。利用私服,Maven只检查局域网的数据,提高构建的速度。
3、部署第三方构件。当某个构件无法从任何一个外部远程仓库获得。建立私服之后,便可以将这些构件部署到私服,供内部的Maven项目使用。
4、提高稳定性,增强控制。Maven构建高度依赖于远程仓库,因此,当网络不稳定的时候,Maven构建也会变得不稳定,甚至无法构建。私服缓存了大量构件,即使暂时没有网络,Maven也可以正常的运行。
5、降低中央仓库的负荷。使用私服可以避免很多对中央仓库的重复下载,降低中央仓库的压力。
Nexus安装
因为是为Maven来服务,使用Maven服务器也是必不可少的,准备好最后验证使用
需要Java环境(192.168.1.1)
[root@localhost ~]# tar zxf jdk-8u201-linux-x64.tar.gz
[root@localhost ~]# mv jdk1.8.0_201/ /usr/local/java
[root@localhost ~]# echo 'export JAVA_HOME=/usr/local/java
> export JRE_HOME=/usr/local/java/jre/
> export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
> export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin' >> /etc/profile
[root@localhost ~]# rm -rf /usr/bin/java
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
安装Nexus
[root@localhost ~]# mkdir /usr/local/nexus
[root@localhost ~]# tar zxf nexus-3.14.0-04-unix.tar.gz -C /usr/local/nexus/
启动服务,运行服务建议3G内存,启动较慢,耐心等待
[root@localhost ~]# /usr/local/nexus/nexus-3.14.0-04/bin/nexus start
[root@localhost ~]# netstat -anpt | grep 8081
Nexus目录
[root@localhost ~]# ls /usr/local/nexus/
nexus-3.14.0-04 sonatype-work
nexus-3.14.0-04:应用目录 存放应用数据,对服务的配置等
sonatype-work:工作目录 存放一些仓库数据
Nexus使用
准备私服的仓库
访问页面192.168.1.1:8081
管理用户登录,管理账户admin,默认密码admin123
查看仓库内容
仓库类型说明
仓库类型 | 说明 |
---|---|
group(仓库组类型) | 又叫仓库组,用于方便开发人员自己设定的仓库 |
hosted(宿主类型) | 内部项目的发布仓库(内部开发人员发布上去存放的仓库) |
proxy(代理类型) | 从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的Configuration页签下Remote Storage Location属性的值,即被代理的远程仓库的路径) |
virtual(虚拟类型) | 虚拟仓库(这个基本上用不到) |
仓库管理
创建一个角色供管理仓库的用户使用,角色类似于用户组,用来编辑权限
创建普通用户,让普通用户的权限就是刚才创建的角色权限
添加代理仓库
地址为aliyun的仓库地址,最下方创建即可
为新添加的aliyun仓库设置查找列表,后期使用jar包时就是依次使用各个仓库下载
使用私服下载
打开另一台服务器:Maven服务器192.168.1.4,整合私服
vim /usr/local/maven/conf/settings.xml
# 添加私服仓库地址,将之前的aliyun仓库使用<!---->注释掉
# 添加:
<mirror>
<id>nexus conf</id>
<name>nexusconf</name>
# 这里的地址为Nexus的地址及端口号
<url>http://192.168.1.1:8081/repository/maven-public/</url>
<mirrorOf>*</mirrorOf> # 拦截所有jar包下载到私服
</mirror>
清空之前的本地仓库
[root@localhost ~]# rm -rf /root/.m2/repository/*
验证私服,随便创建一个项目,或者使用已有项目,执行随便一条mvn命令即可
cd 项目目录
mvn clean install # 可以看到下载地址都是Nexus服务器地址1.1
清除Nexus缓存
私服的上传
内部项目
参考Maven的文章创建一个Web项目(192.168.1.4)
编辑pom文件,使得使用mvn deploy
上传可以上传到指定的Nexus中
[root@192 kgcweb]# vim pom.xml
# 倒数第二行添加,意思为添加本项目的上传仓库
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
# 快照存储库,按照Maven的目录结构,这个库用于存放开发时的不稳定版
<name>Snapshot Repository</name>
<url>http://192.168.1.1:8081/repository/maven-snapshots/</url>
</snapshotRepository>
<repository>
<id>nexus</id>
# 发布存储库,这个库用于稳定后的版本
<name>Releases Repository</name>
<url>http://192.168.1.1:8081/repository/maven-releases/</url>
</repository>
</distributionManagement>
编辑Maven配置文件,加入允许Nexus上传的认证验证信息
vim /usr/local/maven/conf/settings.xml
# 在 </servers>这一行之上,添加server标签
<server>
<id>nexus</id> # 这里的id要和pom上面的一样
<username>kgcdev</username> # 这里的用户名密码是在Nexus的仓库中可以登录的用户相对应
<password>admin123</password>
</server>
验证上传
在Maven服务器192.168.1.4,进入项目根目录执行mvn clean deploy
如果出现报错400/权限拒绝/401等检查用户权限,可以更改为admin用户,或者是因为重复上传报错
默认会上传到snapshots快照仓库中,这是属于开发是存放的仓库,说明还不够稳定,如果要上传到稳定后的存储库,将pom文件中的版本由<version>1.0-SNAPSHOTS</version>
改为<version>1.0</version>
即可,再次上传就倒了releases仓库中
部署策略:允许重复部署(重复发版)
只需要登录到Nexus的管理界面,对仓库的的策略改为允许重复部署,再次重复上传即可
第三方项目上传
创建一个第三方上传之后的仓库
Maven
vim /usr/local/maven/conf/settings.xml
# 在 </servers>这一行之上,添加server标签
<server>
<id>third</id> # 与库名对应
<username>kgcdev</username>
<password>admin123</password>
</server>
这里有一个aliyun线程的第三方jar包,用来上传aliyun-sdk-oss-2.6.1.jar
mvn deploy:deploy-file \
-DgroupId=com.aliyun.oss \
-DartifactId=aliyun-sdk-oss \
-Dversion=2.6.1 -Dpackaging=jar \
-Dfile=/root/aliyun-sdk-oss-2.6.1.jar \
-DrepositoryId=third \
-Durl=http://192.168.1.1:8081/repository/third
如果出现权限拒绝/400/401等问题修改使用的用户,因为有的用户可能权限不够,或者上传项目重复原因
Nexus常见问题
1、仓库数据备份和迁移
只需要将Nexus目录直接移走即可
2、如果admin管理员用户忘记密码
通过进入orientdb数据库,是一种开发使用的数据库
java -jar /usr/local/nexus/nexus-3.14.0-04/lib/support/nexus-orient-console.jar
orientdb>
orientdb> connect plocal:/usr/local/nexus/sonatype-work/nexus3/db/security admin admin
进
orientdb> update user SET password="$shiro1$SHA-512$1024$NE+wqQq/TmjZMvfI7ENh/g==$V4yPw8T64UQ6GfJfxYq2hLsVrBY8D1v+bktfOxGdt4b/9BthpWPNUy/CBk6V9iA0nHpzYzJFWO8v/tZFtES8CA==" UPSERT WHERE id="amdin"
# 更新user表中admin的密码,password的引号里面需要些密码的加密状态
# $shiro1$SHA-512$1024$NE+wqQq/TmjZMvfI7ENh/g==$V4yPw8T64UQ6GfJfxYq2hLsVrBY8D1v+bktfOxGdt4b/9BthpWPNUy/CBk6V9iA0nHpzYzJFWO8v/tZFtES8CA==
# 上一条为admin123的加密状态,写入引号即可
3、上传项目重复报错400或者401
1)使用的Nexus用户权限不足导致,此方法还适用于报错Access denied
2)上传项目重复,仓库上传权限不足
在上面过程都有解决方法