微笑面对每一天,耶!!!咳咳下面的同学不要讲话啦,开始上课啦
这一章,我们来讲讲私服的知识,私服是
maven
的重要组件,但它并不是maven
内部的核心概念,它仅仅是一种衍生出来的特殊maven
仓库在前面的章节中已经提到,使用私服可以起到如降低中央仓库负荷,节省外网带宽,加速
maven
构建,自己部署构建等作用maven
私服种类很多,流行的也有几个,但这里我就不一一做讲解了,下面将主要对nexus
私服做详细介绍,其他私服的功能和nexus
也是相似的,有机会可以自己下去了解一下nexus
是一款不错的仓库管理软件,这里主要对nexus
进行讲解
nexus安装
- 下载
nexus
压缩包(基于windows
系统)
需要到官网下载nexus
私服压缩包,这里需要注意的一点是下载的压缩包一定要是archive
版的,因为professional
版需要提供一个License
,下面是下载地址
https://support.sonatype.com/hc/en-us/articles/218238798
虽然现在nexus
已经发布到3x
版本了,但是我还是比较喜欢用2x
的extjs
界面,所以这里我下载的是2.14
版本的nexus oss
- 安装
nexus
服务
将下载的压缩包解压到指定目录,解压后共有两个文件夹
nexus-2.14.3-02
该目录包含了nexus
运行所需的文件,比如启动脚本,依赖等
sonatype-work
该目录是运行时目录,用于生成运行时所需要的配置文件,日志文件仓库文件等
nexus-2.14.3-02
该目录包含了nexus
运行所需的文件,比如启动脚本,依赖等
sonatype-work
该目录是运行时目录,用于生成运行时所需要的配置文件,日志文件仓库文件等
通过管理员命令行工具进入到nexus
安装目录/nexus-2.14.3-02/bin
执行
nexus.bat install
安装系统服务,完成后执行nexus.bat start
命令启动nexus
服务,或者在服务管理界面(win+R
调出运行面板->services.msc
进入windows
服务控制台),这时可以在控制台中看到nexus
服务已经生成
当然nexus.bat
其中提供了几个常用的命令
install
安装nexus
服务
uninstall
卸载nexus
服务
start
启动nexus
服务
stop
停止nexus
服务
restart
重启nexus
服务 - 登录到
nexus
控制台
nexus
服务启动完成后,我们可以通过浏览器输入http://localhost:8081/nexus
访问nexus
控制台,可以通过管理员(admin/admin123
)用户登录到控制台
运行后,下面将会对控制台各个功能模块进行讲解,并提供一个从项目代码到仓库的完整配置过程
nexus仓库与仓库组(repository)
作为maven
的仓库服务软件,仓库自然是nexus
最重要的概念,nexus
包含几种类型的仓库:代理仓库,宿主仓库和仓库组等
nexus内置仓库
打开nexus
控制台左侧Repositories
可以看到maven
中已经创建了几种仓库
Central
该仓库代理中央仓库,其策略为release
,因此只会下载中央仓库的发布版本Releases
这是一个策略为release
的宿主仓库,用来部署组织内部的发布版本构件Snapshots
这是一个策略为snapshots
的宿主仓库,用来部署组织内部的快照版本构件3rd party
这是一个策略为release
的宿主仓库,用来部署无法从远程仓库下载的第三方发布版本构件Apache Snapshots
这是一个策略为snapshots
的代理仓库,用来专门代理apache maven
仓库的快照版本构件Public Repositories
仓库组将上述所有策略为release
的仓库聚合并通过一致性的地址提供服务,当然这里可以配置将仓库加入到组中上面的这些仓库是如何被使用的呢?
举个例子,项目
X
依赖于很多流行的开源类库如junit
,这些构件都可以从中央仓库获取,因此central
代理仓库就会被用来代理中央仓库,并从中央仓库下载指定依赖并缓存到私服中,X
项目还依赖了Oracle
的jdbc
驱动,由于版权因素,无法从公共仓库中获取,因此公司管理员将其部署到3rd party
仓库中供X
使用,X
项目的快照版本构件成功后会被部署到Snapshots
仓库供其他小组使用,当X
发布正式版本的时候,其构件将会发布到Releases
仓库中,由于X
项目用到了很多仓库,为每一个仓库声明配置又很麻烦,所以可以统一使用仓库组Public Repositories
和Public Snapshots Repositories
maven
仓库分类的概念
下图更直观的展现了代理仓库、宿主仓库、仓库组他们之间的关系
创建宿主仓库
点击左侧Repositories
->Add
->Hosted Repositories
就会出现一个表单
Repository Policy
属性,指定仓库的发布类型有Snapshot
,Release
两种Deployment Policy
属性,默认是Disable Redeploy
,也就是不允许部署,如果需要部署则需要改为Allow Redeploy
,不然项目发布时会报错Allow File Browsing
属性,是否允许浏览仓库中的内容,一般为true
, 每一个仓库创建完成后都会有一个Browse Storage
,在其中以树形方式罗列了当前仓库的存储文件内容Include in Search
属性,表示是否对该仓库进行索引并提供搜索服务,一般为true
Publish URL
属性,用来控制是否通过url
提供服务,如果选false
,当访问该仓库时会得到http 404 Not Found
错误Not Found Cache TTL
表示当一个文件没有找到后,缓存这一不存在信息的时间,默认值为1440
分钟内(也就是一天),在规定的时间内如果nexus
再次得到该文件的请求,那么它将直接返回不存在信息
创建nexus代理仓库
前面的参数和宿主仓库一致,这里我只强调代理仓库的一些特定参数
Remote Storage Location
设置被代理的远程仓库地址Download Remote Indexes
是否下载远程仓库的index
索引文件,下载索引后即使仓库中没有缓存指定的依赖,也可以在nexus
中搜索得到依赖pom
Checksum Policy
设置当依赖校验出错时的处理方式,可以设置忽略、记录警告信息,拒绝下载Artifact Max Age
表示构件缓存的时间,对于release
版本来说为-1
,表示一经下载就一直保存,对于snapshots
来说,每隔一天就需要重新缓存代理构件Metadata Max Age
表示元配置文件的缓存时间
创建nexus仓库组
仓库组并不是一个实实在在存在的东西,而是一个虚拟出来的东西,它并没有Release
与Snapshot
之分,仓库组中包含的仓库顺序决定了仓库组遍历所含仓库的次序,最好将常用的仓库放在前面
nexus索引与构件搜索
在nexus
中为了能够对仓库中的构件进行搜索服务,需要我们将仓库配置中的Download Remote indexes
设置为true
,当修改了这个设置后,我们可以点击左侧Scheduled Tasks
查看当前任务进度情况
当完成索引的下载之后,我们可以在仓库的Browser Storage
选项卡中查看当前仓库的索引结构,然后我们就可以在左侧导航栏的Archive Search
输入框中搜索我们需要的构件了
nexus
提供了几种搜索方式,常用的如keyword search
, GAV Search
(用户通过设置groupid
,artifactId
,version
)进行搜索操作
部署构建到nexus私服中
nexus
提供了两种方式将构建部署到私服中,一种是通过maven
自动部署,需要借助distributeMangement
,另一种是直接上传jar包
通过distributeManagement
自动部署构件
在日常开发中,我们可以将项目的snapshot
发布到项目snapshot
仓库中,发布版发布到release
仓库中,这需要在项目pom
中做一些手脚
下面是mvn-study
项目的配置
<distributionManagement>
<repository>
<id>mvn-study-releases</id>
<name>Mvn Study Project Release Repository</name>
<layout>default</layout>
<url>http://localhost:8081/nexus/content/repositories/mvn-study-releases/</url>
</repository>
<snapshotRepository>
<id>mvn-study-snapshots</id>
<name>Mvn Study Project Releases Repository</name>
<layout>default</layout>
<url>http://localhost:8081/nexus/content/repositories/mvn-study-snapshots/</url>
</snapshotRepository>
</distributionManagement>
如果给定的仓库设置了访问权限,比如mvn-study
该项目建立的snapshot
,只有mvn-study-deployer
角色有操作权限,所以我们还需要为其添加权限,这需要在.m2/settings.xml
中添加访问权限:
<server>
<id>mvn-study-releases</id>
<username>zhenlian</username>
<password>123456</password>
</server>
<server>
<id>mvn-study-snapshots</id>
<username>zhenglian</username>
<password>123456</password>
</server>
手动上传jar包到仓库
这是比较传统的一种方式,比如我们在公共仓库中无法找到的第三方依赖,可以通过此方法上传到私服中,maven3
中,只有release
仓库允许用户上传依赖
在仓库的配置项中,有一个artifact upload
选项页
我们需要添加
GAV Definition
,也就是当前jar
的坐标信息,然后上传给定的依赖jar
包
nexus权限管理
在组织中使用nexus
往往会有一些权限要求,例如只有管理员才能配置nexus
,只有某些团队成员才能部署构件
nexus访问控制模型
nexus
是基于权限(privileges
)做访问控制的, 服务器的每一个资源都有相应的权限来控制,这些权限的分发又是通过角色来实现的,用户可以被赋予多个角色,角色也可以配置多个权限,角色同时还可以包含其他角色
nexus
默认创建了三个用户:admin
拥有对nexus
的完全控制,密码为admin123
deployment
可以对仓库内容浏览、搜索、上传、部署,但是无法配置nexus
anonymous
只能浏览和搜索仓库,但是不能下载nexus
中同时预定义了一些常用且重要的角色:UI:Basic UI Privileges
包含对nexus
界面必须的最基本权限UI:Repository Browser
包含浏览仓库页面所需要的权限UI:Search
包含拥有快速访问搜索栏以及搜索页面所需要的权限Repo: all repositories(read)
给予用户读取所有仓库的权限Repo: all repositories(full control)
给予用户完全控制所有仓库内容的权限
至此nexus
的一些常用知识也就介绍完了,下面是一个实际项目配置方式讲解
项目实战
需求:
- 设置所有项目都从私服中下载构件(也需要屏蔽对中央仓库的访问)
- 为项目单独创建仓库 release,snapshot版本分别对应,同时只允许该项目小组的人员对该项目仓库有操作权限
解决方式: -
nexus
控制台添加Public All Repositories
分组,将包含所有Release/Snapshot
仓库,主要是为了后面镜像转发所有请求,同时为项目创建Release
,Snapshot
仓库
- 项目
pom
中配置部署信息,主要是为了方便部署项目到nexus
<distributionManagement>
<repository>
<id>mvn-study-releases</id>
<name>Mvn Study Project Release Repository</name>
<layout>default</layout>
<url>http://localhost:8081/nexus/content/repositories/mvn-study-releases/</url>
</repository>
<snapshotRepository>
<id>mvn-study-snapshots</id>
<name>Mvn Study Project Releases Repository</name>
<layout>default</layout>
<url>http://localhost:8081/nexus/content/repositories/mvn-study-snapshots/</url>
</snapshotRepository>
</distributionManagement>
- 设置
maven
配置文件settings.xml
,屏蔽中央仓库访问, 将所有请求转发到私服,并设置指定仓库的访问权限
<!--设置项目仓库访问权限,与项目中引用的仓库对应-->
<servers>
<server>
<id>mvn-study-releases</id>
<username>zhenlian</username>
<password>123456</password>
</server>
<server>
<id>mvn-study-snapshots</id>
<username>zhenglian</username>
<password>123456</password>
</server>
</servers>
<!--将所有请求转发到私服 -->
<mirrors>
<mirror>
<id>nexus</id>
<name>Local Nexus Mirror</name>
<url>http://localhost:8081/nexus/content/groups/public-all/</url>
<mirrorOf> * </mirrorOf>
</mirror>
</mirrors>
<!--覆盖对中央仓库的访问-->
<profiles>
<!--这里配置仓库覆盖中央仓库-->
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<!--此时的url已经没用了,因为请求被mirror转发到私服了-->
<url>http://central/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pulginRepositories>
<pluginRepository>
<id>central</id>
<name>Nexus</name>
<url>http://central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pulginRepositories>
</profile>
</profiles>
<!--启动nexus本机仓库-->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
这里我要啰嗦两句,刚开始我在实际部署项目时总是遇到Return Code 400
,Bad Request
错误,检查了一下仓库配置,是忽略了在创建Mvn Study Snapshot Repository
时Deployment Policy(Allow Redeploy) Repository Policy(Snapshot)
好了,今天就到这里啦,0:47,又搞到这么晚,赶紧睡觉为明天黑色周五做准备!!!