nexus私服

安装

本地仓库是本来就有的,默认就在~/.m2/repository下面,也可以在settings.xml里面去配置,搭建一个私服。
搭建私服的话,一般maven这块都是用nexus去搭建的
nexus的安装和启动
从http://nexus.sonatype.org/downloads/下载最新版本的nexus
将bundle包解压缩后放在某个目录下,包含两个子目录
nexus-3.6.0-02:这里包含nexus运行需要的文件
sonatype-work:包含nexus的配置文件、日志文件、仓库文件
启动nexus,windows上cmd,进入到nexus的bin目录下,里面有一个nexus.exe这个文件,执行命令nexus.exe/run启动nexus服务,这块要等个三五分钟,启动很慢,直到出现下图才启动成功
notion image
可以修改nexus的一些配置,有两个配置文件,一个是在bin目录下面的nexus.vmoptions,另外一个是etc目录下面的nexus-default.properties,里面可以修改端口号(默认是8081)
nexus的默认管理员账号和密码是:admin、admin123
ctrl+c可以停止nexus

简介

nexus安装好之后本身就内置了一些仓库 包括四种仓库类型
hosted:宿主仓库,这个仓库,是用来让你把你公司内部的发布包部署到这个仓库里来,然后公司内的其他人就可以从这个宿主仓库里下载依赖去使用
proxy:代理仓库,这个仓库不是用来给你公司内部的发布包部署的,是代理了公司外部的各种仓库的,比如说java.net,codehaus,jboss仓库,最最重要的,就是代理了公司外部的中央仓库,但是这里其实可以修改为nexus连接的应该是国内的阿里云镜像仓库,阿里云去连接中央仓库
其他的一些常用的仓库,java.net,jboss,googlecode,codehaus,这种仓库,现在都很少用了
group:仓库组,其实就是将,各种宿主仓库、代理仓库全部组成一个虚拟的仓库组,然后我们的项目只要配置依赖于一个仓库组,相当于就是可以自动连接仓库组对应的各种仓库
仓库的格式是maven1或者maven2,仓库的布局,我们之前给大家讲解过,布局格式,这里现在统一都是maven2
最后还有仓库的状态和路径
maven-central:这是maven中央仓库的代理仓库
maven-releases:该仓库是个宿主仓库,用于部署公司内部的release版本的发布包(类似于1.0.0,,release的意思就是你的工程已经经过了完善的测试,单元测试,集成测试,QA测试,上生产环境使用了)到这个仓库里面,供其他同事在生产环境依赖和使用
maven-snapshots:该仓库是个宿主仓库,用于部署公司内部的snapshot版本的发布包到这个仓库里(如果你的某个工程还在开发过程中,测试还没结束,但是,此时公司里其他同事也在开发一些工程,需要依赖你的包进行开发和测试,联调,此时你的工程的版本就是类似1.0.0-SNAPSHOT这样的版本),供其他同事在开发和测试的时候使用
3rd party:该仓库是个宿主仓库,主要用来部署没法从公共仓库获取的第三方依赖包,比如说,你的公司依赖于第三方支付厂商的一个依赖包,那个依赖包不是开源的,是商业的包。那么你是没有办法从maven中央仓库获取的。此时,我们可能会自己手动从支付厂商那里获取到一个jar包,下载之后上传到私服里来,就放这个仓库里,3rd-party仓库
maven-public:仓库组,上面所有release仓库都在这个仓库组内
notion image
 

设置三方库

maven-public仓库组:已有
maven-central代理仓库:从直接代理maven中央仓库,修改为代理阿里云仓库,http://maven.aliyun.com/nexus/content/groups/public
notion image
maven-snapshots宿主仓库:已有
maven-releases宿主仓库:已有
3rd-party仓库:需要手动创建
notion image
notion image
 
notion image
再次配置maven-public仓库组,将3rd-party仓库加入其中
notion image

设置强制走私服

将公司中的项目配置为强制从公司内的私服来下载,不允许走外网,这样可以统一收口管理。毕竟nexus私服本身也是代理了各种中央仓库,直接用nexus私服就可以了。
通常会在settings.xml配置文件中,为当前机器统一配置使用的私服仓库地址,而且一般都是直接用私服中的仓库组,在settings.xml中用profiles即可。
<profiles> <profile> <id>nexus</id> <repositories> <repository> <id>nexus</id> <name>Nexus </name> <url>[http://localhost:8081/nexus/content/groups/public](http://localhost:8081/nexus/content/groups/public)</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>nexus</id> <name>Nexus Plugin Repository</name> <url>[http://localhost:8081/nexus/content/groups/public](http://localhost:8081/nexus/content/groups/public)</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles>
激活对应的profile,在项目执行构建的时候,就会将profile中的仓库配置应用到每个项目中去
除此之外,我们还需要用mirror镜像机制,来强制要求所有对远程仓库的请求,全部通过镜像走私服。所谓的镜像,就是如果某个仓库A代理了另外一个仓库B,里面的内容完全一样,那么仓库A就是仓库B的镜像。
你可以认为是阿里云仓库就是中央仓库的一个镜像,nexus私服配置成所有远程仓库的镜像
配置需要进行下面的改造:
<mirrors> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/nexus/content/groups/public</url> </mirror> </mirros>
将所有repository的id修改为central,直接覆盖maven超级pom中的morning中央仓库,相当于此时唯一的远程中央仓库变成了我们自己配置的两个仓库。
然后将url配置全部改为http://central,其实是没意义的一个url,因为此时在需要从远程仓库下载依赖或者插件的时候,会从两个自己配置的central仓库去走,然后看release或者snapshot是否支持,如果支持,那么就会找镜像配置,由于我们的镜像匹配所有请求,所以所有请求都会走镜像,而镜像配置的是私服地址,所以相当于所有的请求都会走私服了。
我们现在在项目里加入新的一个依赖,比如zookeeper的一个依赖,然后看看理论上来说,应该有的效果,是从私服,私服是从阿里云去下载,私服上会有一份依赖,然后本地仓库里也有一份依赖
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.10</artifactId> <version>0.10.2.1</version> </dependency>

设置权限

我们声明依赖,我们要开发一个功能,需要用到一些依赖,基于nexus私服的机制给我们拉取所有的依赖到本地仓库供我们使用,同时私服上也会缓存一份。接下来我们要干嘛?
接下来实际上来说,我们就要使用各种依赖开始写代码,实现各种功能,写单元测试,本地工程跑一跑走一下冒烟测试。
比如类似于我们这种大型的项目,每个模块/每个服务,都是一个单独的工程,我们有一个5个人的团队,除了leader不写代码之外,其他4个人每个人都负责一个工程。
所以我们每个人把自己的代码写好之后,要跟其他就要联调,测试。
我们需要将我们的代码部署到私服仓库里面去,让团队中其他人可以从私服里拉取和下载我们写好的代码对应的那个jar包,然后就可以在自己本地调用我们的jar包里面的各种方法和类,按照约定来写代码和测试。
所以我们现在要学习的就是说,假设我们写好了代码,需要将我们写好的代码打成一个jar包,供其他人去引用和依赖,然后基于我们的代码去开发,此时就涉及到一个问题,如何将我们写好的代码,清理/编译/测试/打包/部署到私服。
我们需要学习如何将自己的工程打包后发布到私服。
而且我们没做任何权限认证的事情,那是因为,nexus私服默认就是可以读的,不需要认证,公司局域网内的人都可以去配置之后拉取依赖
但是如果下一讲要进行部署的话,我们是需要有一个专用的部署账号,通过账号认证,才能部署发布包到nexus私服的
nexus的权限是典型的RBAC模型,role-based access control。每个用户可以分配多个角色,每个角色分配多个权限,每个权限就是一个具体的功能,比如浏览依赖,部署发布包,等等。
nexus默认有三个用户:
admin,管理员账号,密码是admin123 deployment,可以搜索和部署构建,就是普通的开发账号,密码是deployment123(在nexus 3.x最新版本里已经被消除掉了) anonymous:如果没有给认证信息,就是这个匿名账号,可以下载依赖,查看依赖
可以在Users页面里添加用户,管理用户,还可以对用户的Role Tree进行角色的分配,nexus有一些预定义的角色,直接可以用。
也可以对单个仓库创建角色,并给角色分配对仓库的权限,然后就可以将单个仓库的授权角色分配给不同项目的用户,但是说实话,这个很少用。
接下来要做的一个事情是什么呢?
我们光是有admin和匿名账号是不够的,我们需要创建一个专门用来部署的账号,deployment:
(1)涵盖所有匿名账号的权限,至少可以搜索仓库,下载依赖 (2)对仓库有所有的管理权限,就可以往仓库中去部署发布包