基础组件-安装Nexus及简单使用

  • 使用私服,就可以降低中央仓库负荷、节省外网带宽、加速Maven构建、部署自己的构件等,从而高效地使用Maven。
  • 有三种专门的Maven仓库管理软件可以用来建立私服:Apache基金会的ArchivaJFrog的ArtifactorySonatype的Nexus。其中,Arehiva是开源的,而Artifactory和Nexus的核心也是开源的。
  • Nexus是当前最流行的Maven仓库管理软件。
  • Nexus分为开源版和专业版,其中开源版本基于GPLv3许可证,其特性足以满足大部分Maven用户的需要。下面是Nexus开源版本的一些特性:
    • 较小的内存占用(最少仅为28MB)
    • 基于ExtJS的友好界面
    • 基于Restlet的完全REST API
    • 支持代理仓库、宿主仓库和仓库组
    • 基于文件系统,不需要数据库
    • 支持仓库索引和搜索
    • 支持从界面上传Maven构件
    • 细粒度的安全控制
  • Nexus专业版本是需要付费购买的,除了开源版本的所有特性之外,它主要包含一些企业安全控制、发布流程控制等需要的特性。

1、安装Nexus

1、安装jdk

  • jdk-8u162-linux-x64

2、下载nexus

https://help.sonatype.com/repomanager3/product-information/download
https://help.sonatype.com/repomanager3/product-information/download/download-archives---repository-manager-3

https://download.sonatype.com/nexus/3/nexus-3.22.1-02-unix.tar.gz

3、安装nexus

]# tar zvfx nexus-3.22.1-02-unix.tar.gz -C /usr/local/

]# cd /usr/local/
]# ln -s nexus-3.22.1-02 nexus
  • nexus-3.22.1-02:该目录包含了Nexus运行所需要的文件,如启动脚本、依赖jar包等。
  • sonatype-work:该目录包含Nexus生成的配置文件、日志文件、仓库文件等。
    • Nexus会在运行的时候动态创建该目录。
    • 备份Nexus时,只需要备份sonatype-work目录,因为该目录包含了用户特定的内容。

4、配置nexus

//(1)修改数据存储路径和内存
]# vim /usr/local/nexus/bin/nexus.vmoptions
%s#../sonatype-work#/data/sonatype-work#g

//(2)修改端口
]# vim /usr/local/nexus/etc/nexus-default.properties
application-port=18082

5、启动nexus

]# /usr/local/nexus/bin/nexus start

6、登录nexus

  • (1)访问nexus
    • http://10.1.1.11:18082/

  • (2)登录nexus

2、Nexus的仓库与仓库组

1、Nexus的仓库类型

  • Nexus的仓库类型有:代理仓库、宿主仓库和仓库组。
    • 宿主仓库(hosted):Maven可以直接从宿主仓库下载构件
    • 代理仓库(proxy):Maven可以从代理仓库下载构件,而代理仓库会从远程仓库下载并缓存构件。
    • 仓库组(group):为了方便,Maven可以从仓库组下载构件,而仓库组没有实际内容(图中用虚线表示),它会转向其包含的宿主仓库或者代理仓库获得实际构件的内容。

2、Nexus内置的仓库

  • maven-central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
  • maven-releases:这是一个策略为Release的宿主类型仓库,用来部署组织内部的发布版本构件。
  • maven-snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件。

2.1、创建Nexus宿主仓库

1、创建仓库

2、选择创建maven2-hosted(宿主仓库)

3、配置maven2-hosted(宿主仓库)

  • Name:仓库的名称(ID)。
  • Online:是否允许使用URL浏览仓库。
  • Maven 2
    • Version policy:配置该仓库是发布版构件仓库还是快照版构件仓库。
  • Hosted
    • Deployment Policy用来配置该仓库的部署策略。
      • 有三种策略:只读(禁止部署)、禁止重新部署(同一构件只能部署一次)、允许重新部署。

2.2、创建Nexus代理仓库

1、创建仓库

2、选择创建maven2-proxy(代理仓库)

3、配置maven2-proxy(代理仓库)

  • Name:仓库的名称(ID)。
  • Online:是否允许使用URL浏览仓库。
  • Maven 2
    • Version policy:配置该仓库是发布版构件仓库还是快照版构件仓库。
  • Proxy
    • Remote storage:被代理的远程仓库的URL。
    • Auto blocking enabled:如果检测到远程仓库不可达/无响应,则自动阻止存储库上的出站连接(即不再去请求远程仓库中的构件)。
    • Maximum component age:缓存构件后,在此时间之前不再重新检查远程仓库中的构件(以分钟为单位)。
      • 发布版构件仓库:一般配置为-1,表示构件缓存后就一直保存着,不再重新下载。
      • 快照版构件仓库:一般配置为1440,表示每隔一天就重新缓存构件。
    • Maximum metadata age:缓存元数据后,在此时间之前不再重新检查远程仓库中的元数据(以分钟为单位)。
  • Negative Cache
    • Not found cache enabled:缓存未出现在代理存储库中的内容的响应。
    • Not found cache TTL:表示当一个文件没有找到后,缓存这一不存在信息的时间。以默认值1440分钟为例,如果某文件不存在,那么在之后的1440分钟内,如果Nexus再次得到该文件的请求,它将直接返回不存在信息,而不会去请求远程仓库。这么做是为了避免重复的文件查找操作以提升性能。

2.3、创建Nexus仓库组

1、创建仓库

2、选择创建maven2-group(仓库组)

3、配置maven2-group(仓库组)

  • Name:仓库组的名称(ID)。
  • Online:是否允许使用URL浏览仓库。
  • Group
    • Member repositorles:选择并排序属于该组的仓库。
      • 注意,仓库组所包含的仓库的顺序决定了仓库组遍历其所含仓库的次序,因此最好将常用的仓库放在前面,当用户从仓库组下载构件的时候,就能够尽快地访问到包含构件的仓库。
  • 需要注意的是,仓库组没有Release和Snapshot的区别,这不同于宿主仓库和代理仓库。在配置界面中,用户可以非常直观地选择Nexus中的仓库,将其聚合成一个虚拟的仓库组

3、配置Maven从Nexus私服下载构件

  • 除了简单的关键字搜索,Nexus还提供了GAV搜索、类名搜索和校验和搜索等功能,用户可以单击搜索页面左上角的下拉菜单选择高级搜索功能:
    • GAV搜索(GAV Search)允许用户通过设置Groupid、Artifactid和Version等信息来进行更有针对性的搜索。
    • 类名搜索(ClassnameSearch)允许用户搜索包含某个Java类的构件。
    • 校验和搜索(ChecksumSearch)允许用户直接使用构件的校验和来搜索该构件。

3.1、仅对当前Maven项目有效

  • 当前项目的pom.xml中配置Maven依赖仓库和插件仓库,只对当前Maven项目有效
<project>
    ...
    <!--  配置依赖仓库  -->
    <repositories>
        <repository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://10.1.1.11:18082/repository/maven-myGroup/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <!--  配置插件仓库  -->
    <pluginRepositories>
        <pluginRepository>
            <id>nexus</id>
            <name>Nexus</name>
            <url>http://10.1.1.11:18082/repository/maven-myGroup/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
    ...
</project>

3.2、对所有Maven项目有效

  • 在实际应用中,一般都是通过一次配置就能让本机上的所有Maven项目都使用自己的Maven私服。
  • setting.xml中为Maven配置依赖仓库和插件仓库,该文件中的配置对所有本机Maven项目有效,但是settings.xml并不支持直接配置repositories和pluginRepositories。所幸Maven还提供了Profile机制,能让用户将仓库配置放到setting.xml中的Profile中
</settings>
  ...
  <profiles>
    <!--  将依赖仓库和插件仓库配置在profile中  -->
    <profile>
      <!--  profile的ID  -->
      <id>nexus-profile</id>
	  
      <!--  配置依赖仓库  -->
      <repositories>
          <repository>
              <id>nexus</id>
              <name>Nexus</name>
              <url>http://10.1.1.11:18082/repository/maven-myGroup/</url>
              <releases>
                  <enabled>true</enabled>
              </releases>
              <snapshots>
                  <enabled>true</enabled>
              </snapshots>
          </repository>
      </repositories>

      <!--  配置插件仓库  -->
      <pluginRepositories>
          <pluginRepository>
              <id>nexus</id>
              <name>Nexus</name>
              <url>http://10.1.1.11:18082/repository/maven-myGroup/</url>
              <releases>
                  <enabled>true</enabled>
              </releases>
              <snapshots>
                  <enabled>true</enabled>
              </snapshots>
          </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

  <!--  通过profile的ID激活上面的配置  -->
  <activeProfiles>
    <activeProfile>nexus-profile</activeProfile>
  </activeProfiles>
  ...
</settings>
  • 该配置中使用了一个id为nexus-profile的profile,这个profile包含了相关的仓库配置,同时配置中又使用activeProfile元素将nexus-profile这个profile激活,这样当执行Maven进行构建时,激活的profile会将仓库配置应用到项目中去

3.3、Maven所有的下载请求都通过Nexus私服

  • 上例的配置已经能让本机上的所有Maven项目都从Nexus私服下载构件。但Maven除了从Nexus私服下载构件之外,还会不时地访问中央仓库central,我们希望的是所有Maven下载请求都仅仅通过Nexus私服,以全面发挥私服的作用。这个时候就需要使用Maven镜像配置了。可以创建一个匹配任何仓库的镜像,镜像的地址为私服,这样,Maven对任何仓库的构件下载请求都会转到私服中。
</settings>
  ...
  <!--  将依赖仓库和插件仓库配置在profile中  -->
  <mirrors>
    <mirror>
      <id>nexus</id>
      <name>Nexus</name>
      <url>http://10.1.1.11:18082/repository/maven-myGroup/</url>
      <mirrorOf>*</mirrorOf>
    </mirror>
  </mirrors>

  <profiles>
    <!--  将依赖仓库和插件仓库配置在profile中  -->
    <profile>
      <!--  profile的ID  -->
      <id>nexus-profile</id>
	  
      <!--  配置依赖仓库  -->
      <repositories>
          <repository>
              <id>central</id>
              <name>central</name>
              <url>http://central</url>
              <releases>
                  <enabled>true</enabled>
              </releases>
              <snapshots>
                  <enabled>true</enabled>
              </snapshots>
          </repository>
      </repositories>

      <!--  配置插件仓库  -->
      <pluginRepositories>
          <pluginRepository>
              <id>central</id>
              <name>central</name>
              <url>http://central</url>
              <releases>
                  <enabled>true</enabled>
              </releases>
              <snapshots>
                  <enabled>true</enabled>
              </snapshots>
          </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

  <!--  通过profile的ID激活上面的配置  -->
  <activeProfiles>
    <activeProfile>nexus-profile</activeProfile>
  </activeProfiles>
  ...
</settings>
  • 这里需要注意的是依赖仓库及插件仓库的配置,它们的id都为central,也就是说,覆盖了超级POM中央仓库的配置,它们的url已无关紧要了,因为所有请求都会通过镜像访问私服地址。配置依赖仓库及插件仓库的主要目的是开启对快照版本下载的支持,当Maven需要下载发布版或快照版构件的时候,它首先检查central仓库,看该类型的构件是否支持,得到正面的回答之后,再根据镜像匹配规则转而访问私服仓库地址。

4、部署构件至Nexus私服

  • 如果只为代理外部公共仓库,那么Nexus的代理仓库就已经能够完全满足需要了。对于另一类Nexus仓库——宿主仓库,它们的主要作用是储存组织内部的,或者一些无法从公共仓库中获得的第三方构件,供大家下载使用
  • 用户可以配置Maven自动部署构件至Nexus的宿主仓库,也可以通过界面手动上传构件。

4.1、使用Maven部署构件至Nexus私服

  • 日常开发生成的快照版本构件可以直接部署到Nexus中策略为Snapshot的宿主仓库中,项目正式发布的构件则应该部署到Nexus中策略为Release的宿主仓库中。
  • 可以在项目pom.xml文件中配置,也可以在maven的setting.xml文件中配置。
    • 在setting.xml中配置如下所示:
</settings>
  ...
  <servers>
    <!--  配置认证信息  -->
    <server>
      <id>my-proj</id>
      <username>admin</username>
      <password>admin</password>
    </server>
  </servers>

  <profiles>
    <!--  使用Maven部署构件至Nexus私服  -->
    <profile>
      <!--  profile的ID  -->
      <id>deploy-profile</id>
      <distributionManagement>
          <repository>
              <id>my-proj</id>
              <name>Project Release Repository</name>
              <url>http://10.1.1.11:18082/repository/maven-releases/</url>
          </repository>
          <snapshotRepository>
              <id>my-proj</id>
              <name>Project Snapshot Repository</name>
              <url>http://10.1.1.11:18082/repository/maven-snapshots/</url>
          </snapshotRepository>
      </distributionManagement>
    </profile>
  </profiles>

  <!--  通过profile的ID激活上面的配置  -->
  <activeProfiles>
    <activeProfile>deploy-profile</activeProfile>
  </activeProfiles>
  ...
</settings>

4.2、手动部署第三方构件至Nexus

  • 某些Java Jar文件(如Oracle)的JDBC驱动,由于许可证的原因,它们无法公开地放在公共仓库中。此外,还有大量的小型开源项目,它们没有把自己的构件分发到中央仓库中,也没有维护自己的仓库,因此也无法从公共仓库获得。这个时候用户就需要将这类构件手动下载到本地,然后通过Nexus的界面上传到私服中

5、Nexus的权限管理

  • 在使用Nexus的时候往往会有一些安全需求,例如希望只有管理员才能配置Nexus,只有某些团队成员才能部署构件。或者更细一些的要求,例如每个项目都有自己的Nexus宿主仓库,且只能部署项目构件至该仓库中。Nexus提供了全面的权限控制特性,能让用户自由地根据需要配置Nexus用户、角色、权限等。

5.1、Nexus的访问控制模型

  • Nexus是基于权限(Privilege)做访问控制的,服务器的每一个资源都有相应的权限来控制,因此用户执行特定的操作时就必须拥有必要的权限。管理员必须以角色(Role)的方式将权限赋予Nexus用户。例如要访问Nexus界面,就必须拥有Status-(read)这个权限,而Nexus默认配置的角色UI:BasicUIPrivileges就包含了这个权限,再将这个角色分配给某个用户,这个用户就能访问Nexus界面了。
  • 一个用户可以被赋予一个或者多个角色一个角色可以包含一个或者多个权限角色还可以包含一个或者多个其他角色
    • Nexus预定义了两个用户:
      • admin:该用户拥有对Nexus服务的完全控制。
      • anonymous:该用户对应了所有未登录的匿名用户。
        • 没有登录的用户会拥有匿名角色的权限,匿名用户可以访问基本的Nexus界面、浏览仓库内容及搜索构件。
    • Nexus预定义了两个角色:
      • nx-admin:拥有所有的权限(nx-all)。
      • nx-anonymous:拥有四种权限,分别是nx-healthcheck-read、nx-repository-view-*-*-browse、nx-repository-view-*-*-read和nx-search-read。

5.2、为项目分配独立的仓库

  • 在Nexus中,权限是基于Repository Target建立的,Repository Target实际上是一系列正则表达式,在访问仓库某路径下内容的时候,Nexus会将仓库路径与Repository Target的正则表达式一一匹配,以检查权限是否正确。
  • (1)创建仓库
    • 创建仓库后,在权限列表中就会有和该仓库相关的权限(增、删、改、查)。

  • (2)创建角色,将需要的权限赋给该角色。
  • (3)创建用户,将需要的角色付给用户

1

#                                                                                                                          #
posted @ 2023-10-14 00:04  麦恒  阅读(312)  评论(0编辑  收藏  举报