六、nexus创建私服

微笑面对每一天,耶!!!咳咳下面的同学不要讲话啦,开始上课啦

study.jpg

这一章,我们来讲讲私服的知识,私服是maven的重要组件,但它并不是maven内部的核心概念,它仅仅是一种衍生出来的特殊maven仓库
在前面的章节中已经提到,使用私服可以起到如降低中央仓库负荷,节省外网带宽,加速maven构建,自己部署构建等作用
maven私服种类很多,流行的也有几个,但这里我就不一一做讲解了,下面将主要对nexus私服做详细介绍,其他私服的功能和nexus也是相似的,有机会可以自己下去了解一下
nexus是一款不错的仓库管理软件,这里主要对nexus进行讲解

nexus安装

  1. 下载nexus压缩包(基于windows系统)
    需要到官网下载nexus私服压缩包,这里需要注意的一点是下载的压缩包一定要是archive版的,因为professional版需要提供一个License,下面是下载地址
    https://support.sonatype.com/hc/en-us/articles/218238798
    虽然现在nexus已经发布到3x版本了,但是我还是比较喜欢用2xextjs界面,所以这里我下载的是2.14版本的nexus oss
  2. 安装nexus服务
    将下载的压缩包解压到指定目录,解压后共有两个文件夹
    图片1.png

    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服务已经生成
    图片2.png

    当然nexus.bat其中提供了几个常用的命令
    install安装nexus服务
    uninstall卸载nexus服务
    start启动nexus服务
    stop停止nexus服务
    restart重启nexus服务
  3. 登录到nexus控制台
    nexus服务启动完成后,我们可以通过浏览器输入http://localhost:8081/nexus访问nexus控制台,可以通过管理员(admin/admin123)用户登录到控制台
    运行后,下面将会对控制台各个功能模块进行讲解,并提供一个从项目代码到仓库的完整配置过程

nexus仓库与仓库组(repository)

作为maven的仓库服务软件,仓库自然是nexus最重要的概念,nexus包含几种类型的仓库:代理仓库,宿主仓库和仓库组等
nexus内置仓库
打开nexus控制台左侧Repositories可以看到maven中已经创建了几种仓库

图片3.png

Central该仓库代理中央仓库,其策略为release,因此只会下载中央仓库的发布版本
Releases这是一个策略为release的宿主仓库,用来部署组织内部的发布版本构件
Snapshots这是一个策略为snapshots的宿主仓库,用来部署组织内部的快照版本构件
3rd party这是一个策略为release的宿主仓库,用来部署无法从远程仓库下载的第三方发布版本构件
Apache Snapshots这是一个策略为snapshots的代理仓库,用来专门代理apache maven仓库的快照版本构件
Public Repositories仓库组将上述所有策略为release的仓库聚合并通过一致性的地址提供服务,当然这里可以配置将仓库加入到组中
上面的这些仓库是如何被使用的呢?
举个例子,项目X依赖于很多流行的开源类库如junit,这些构件都可以从中央仓库获取,因此central代理仓库就会被用来代理中央仓库,并从中央仓库下载指定依赖并缓存到私服中,X项目还依赖了Oraclejdbc驱动,由于版权因素,无法从公共仓库中获取,因此公司管理员将其部署到3rd party仓库中供X使用,X项目的快照版本构件成功后会被部署到Snapshots仓库供其他小组使用,当X发布正式版本的时候,其构件将会发布到Releases仓库中,由于X项目用到了很多仓库,为每一个仓库声明配置又很麻烦,所以可以统一使用仓库组Public RepositoriesPublic Snapshots Repositories

maven仓库分类的概念

下图更直观的展现了代理仓库、宿主仓库、仓库组他们之间的关系


maven仓库间联系.png

创建宿主仓库
点击左侧Repositories->Add->Hosted Repositories就会出现一个表单

创建宿主仓库.png

创建宿主仓库2.png

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代理仓库

创建代理仓库.png

创建代理仓库2.png

创建代理仓库3.png

前面的参数和宿主仓库一致,这里我只强调代理仓库的一些特定参数
Remote Storage Location设置被代理的远程仓库地址
Download Remote Indexes是否下载远程仓库的index索引文件,下载索引后即使仓库中没有缓存指定的依赖,也可以在nexus中搜索得到依赖pom
Checksum Policy设置当依赖校验出错时的处理方式,可以设置忽略、记录警告信息,拒绝下载
Artifact Max Age表示构件缓存的时间,对于release版本来说为-1,表示一经下载就一直保存,对于snapshots来说,每隔一天就需要重新缓存代理构件
Metadata Max Age表示元配置文件的缓存时间

创建nexus仓库组

仓库组创建.png
仓库组创建2.png

仓库组并不是一个实实在在存在的东西,而是一个虚拟出来的东西,它并没有ReleaseSnapshot之分,仓库组中包含的仓库顺序决定了仓库组遍历所含仓库的次序,最好将常用的仓库放在前面

nexus索引与构件搜索

nexus中为了能够对仓库中的构件进行搜索服务,需要我们将仓库配置中的Download Remote indexes设置为true,当修改了这个设置后,我们可以点击左侧Scheduled Tasks查看当前任务进度情况
当完成索引的下载之后,我们可以在仓库的Browser Storage选项卡中查看当前仓库的索引结构,然后我们就可以在左侧导航栏的Archive Search输入框中搜索我们需要的构件了

仓库搜索.png

仓库搜索.png

nexus提供了几种搜索方式,常用的如keyword search, GAV Search(用户通过设置groupidartifactId,version)进行搜索操作

仓库搜索.png

部署构建到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选项页

手动上传构建.png

我们需要添加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的一些常用知识也就介绍完了,下面是一个实际项目配置方式讲解

项目实战

需求:

  1. 设置所有项目都从私服中下载构件(也需要屏蔽对中央仓库的访问)
  2. 为项目单独创建仓库 release,snapshot版本分别对应,同时只允许该项目小组的人员对该项目仓库有操作权限
    解决方式:
  3. nexus控制台添加Public All Repositories分组,将包含所有Release/Snapshot仓库,主要是为了后面镜像转发所有请求,同时为项目创建Release,Snapshot仓库
创建项目仓库.png
  1. 项目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>
  1. 设置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 400Bad Request错误,检查了一下仓库配置,是忽略了在创建Mvn Study Snapshot RepositoryDeployment Policy(Allow Redeploy) Repository Policy(Snapshot)
好了,今天就到这里啦,0:47,又搞到这么晚,赶紧睡觉为明天黑色周五做准备!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,565评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,021评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,003评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,015评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,020评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,856评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,178评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,824评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,264评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,788评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,913评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,535评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,130评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,102评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,334评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,298评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,622评论 2 343

推荐阅读更多精彩内容