Nexus简介

私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。

Nexus 专业版是需要付费的,其开源版为 Nexus OSS。Nexus 提供两种安装包,一种是包含 Jetty 容器的 bundle 包,另一种是不包含容器的 war 包。

下载地址:http://www.sonatype.org/nexus/go。

个人感觉,使用私服较多的场景就是:某些公司办公环境在内网,且内网不允许连接外部网络,内外网通过某种通道传递数据。这时,如果使用到Maven,则需要搭建一套Maven私服(譬如我们公司……)。

走进Nexus

仓库的分类

我们以Nexus2为例:
Nexus 的仓库分为这么几类:

  • hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件(如 oracle 的 JDBC 驱动)以及自己或第三方的项目构件;
  • proxy 代理仓库:代理公共的远程仓库;
  • virtual 虚拟仓库:用于适配 Maven 1;
  • group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。

    所有仓库在本地都会有一个文件夹存放各自缓存的jar!

    Nexus默认内置的仓库

    Nexus 可能内置了如下仓库(不同版本可能不同):
  • Maven Central :代理 Maven 的中央仓库,策略为 release
  • Releases :策略为 Release的宿主类仓库,用来部署组织内部的 release 版本构件 Snapshots :策略为 Snapshot的宿主类仓库,用来部署组织内部的 release 版本构件
  • 3rd party :策略为 Release的宿主类仓库,用来部署无法从公共仓库获得的第三方 release 版构件。
  • Apache Snapshots :代理 Apache Maven 仓库,策略为Snapshot
  • Codehaus Snapshots :代理 Codehaus Maven 仓库,策略为Snapshot
  • Google Code :代理 Google Code Maven 仓库,策略为 Release
  • Java.net – Maven 2 :代理 Java.net Maven 仓库,策略为Release
  • Public Repositories :将上述策略为 Release 的仓库聚合并通过一致的地址提供服务。
  • Public Snapshot Repositories :将上述策略为 Snapshot 的仓库聚合并通过一致的地址提供服务。

    详解各类仓库配置

    Hosted仓库

    创建 Nexus 宿主仓库时,仓库会默认地存放在 sonatype-work/nexus/storage/[repository-id]/ 下,也可以填写 Override Local Storage Location 自定义仓库的存储路径。同时可以设置以下选项:
    • Deployment Policy只读(禁止部署)、关闭多次部署(同一构件只能部署一次)或允许多次部署
    • Allow File Browser :设置是否允许在 Repository 的 Browse Storage 选项卡中浏览仓库。
    • Include in Search :设置是否对该仓库进行索引并暴露给搜索。
    • Publish URL :设置是否通过 URL 提供服务,如为 false ,访问该仓库的地址时会得到 404
    • Not Found Cache TTL :缓存未找到文件信息的时间(此时间内不再去找,直接返回没找到)

      Proxy仓库

      创建 Nexus 代理仓库时,除了设置远程仓库的地址和认证信息外,还可以设置以下选项:
    • Download Remote Indexes :设置是否下载远程仓库的索引。(下载远程仓库的索引后,即使没有缓存远程仓库的构件,用户依然能搜索或浏览构件的基本信息
    • Checksum Policy :设置校验和出错时,是忽略、记录警告信息还是拒绝下载。
    • Artifact Max Age :设置多久更新一次 Artifact (对于策略为 release 的仓库,可以设置为 -1 ,也就是永不更新)
    • Metadata Max Age :设置多久更新一次 metadata 。

      Public仓库

      仓库策略分为 releasesnapshot,一般用在 proxy仓库 和 hosted仓库,分别表示发布版和快照版。而仓库组没有 Release 和 Snapshot 的区别,创建时会让用户选择由哪些宿主仓库或代理仓库构成。仓库组所包含的仓库的顺序决定了仓库组遍历它们的次序,所以最好将常用的仓库放在前面。

      Nexus的索引

      索引搜索

      Nexus 通过维护仓库的索引来提供搜索功能。
  • 远程索引:这里只针对代理仓库,其他仓库不存在远程索引一说。配置好远程仓库后,搜索时仍然是不能搜到远程仓库的任意文件的。为了能搜索到远程仓库的所有文件,我们需要开启 Nexus 中的代理仓库下载远程索引(默认这个设置是关闭的)。
    只要远程仓库提供 nexus-indexer 形式的索引, Nexus 就可以下载它的索引。这样在你搜索时,无论私服本地是否存在相应文件,都能被搜索到,然后项目引用时,nexus会去远程仓库下载,并缓存在本地。
  • Hosted仓库: Nexus 也可以对宿主仓库和代理仓库进行索引。仓库有了索引之后,可以在其 Browse Index 选项卡中浏览仓库内容的树形结构。

    索引更新

    点击仓库,右键,会弹出一组列表,其中就有修复索引更新索引功能,你可以在 Browse Index 选项卡看到当前仓库的最新索引树状图。 Browse Storage 选项卡可以看到本地文件夹的所有jar树状图。

    索引更新与Jar上传

    一般,我们不需要进行索引更新,因为jar一般是通过Artifact Upload选项卡上传或者通过程序配置distributionManagement节点进行deploy上传。这时能实时更新。

以上针对jar很少量情况,如果需要大量上传jar:比如你在内网环境下,需要手动上传大量jar包;又或者你需要简单快速地把本地Maven仓库的所有 jar 扔到 nexus 上?

这时,其实我们可以直接把本地Maven仓库打包,直接覆盖到 nexus 那台主机的相应Hosted仓库的Local Storage Location文件夹。但是扔上去后,搜索时并不能搜到我们上传的 jar,因为还未给这些 jar 建立索引!

我们可以通过Scheduled Tasks定时任务来定时更新索引:

  1. Task Type 选择 Update Repositories Index
  2. Task Settings下可直接选择 Repository/GroupAll Repositories,表示所有仓库都进行索引更新
  3. Recurrence 可选择更新频率,Manual表示手动执行。

PS:由于我们公司私服部署在内网,需要先外网下载依赖,然后打包传到内网,最后上传到 nexus 私服,并手动更新索引。我通过程序实现了自动化:

  1. 外网的某页面贴入maven依赖
  2. 构造一个maven项目,用于执行 denpency:tree 解析依赖树
  3. 打包下载相应 jar
  4. 通过指定渠道传回内网 ftp 服务器
  5. 内网应用程序监听ftp
  6. 发现文件后下载到 nexus 私服相关Local Storage Location文件夹
  7. 调用Scheduled Tasks手动更新索引。

关键在于更新索引处:

  1. 登录 http://ip:port/nexus/service/local/authentication/login?_dc=
  2. 更新索引 http://ip:port/nexus/service/local/schedule_run/`[id]`
  3. 登出 http://ip:port/nexus/service/local/authentication/logout

以上的 [id] 表示你建立的定时任务ID,它是递增的,总是等于你建立的定时任务的次数。如你第五次建立定时任务,则该任务的ID即是5

Nexus2与Nexus3

目前Nexus已升级到3.x,我就简单做下浅显比较:

  • 3.x版本界面漂亮
  • 3.x对于jar的本地缓存不再是像2.x一样,直接保存单个jar包,而是采用Blob Stores保存,即一个jar被保存为单bytes文件。因此将没法使用:直接批量扔jar,再手动更新这种方式。
  • 相比2.x,自带JAVA环境,安装方便
  • 支持管理Docker
  • 支持npm和bower的package管理
  • 不能再像2.x一样,点击相关jar后含有出现<dependency>,方便复制粘贴

参考:

更多文章,请关注:开猿笔记