基础组件-安装Nexus及简单使用
- 使用私服,就可以降低中央仓库负荷、节省外网带宽、加速Maven构建、部署自己的构件等,从而高效地使用Maven。
- 有三种专门的Maven仓库管理软件可以用来建立私服:Apache基金会的Archiva、JFrog的Artifactory和Sonatype的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用来配置该仓库的部署策略。
- 有三种策略:只读(禁止部署)、禁止重新部署(同一构件只能部署一次)、允许重新部署。
- 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:选择并排序属于该组的仓库。
- 注意,仓库组所包含的仓库的顺序决定了仓库组遍历其所含仓库的次序,因此最好将常用的仓库放在前面,当用户从仓库组下载构件的时候,就能够尽快地访问到包含构件的仓库。
- 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。
- Nexus预定义了两个用户:
5.2、为项目分配独立的仓库
- 在Nexus中,权限是基于Repository Target建立的,Repository Target实际上是一系列正则表达式,在访问仓库某路径下内容的时候,Nexus会将仓库路径与Repository Target的正则表达式一一匹配,以检查权限是否正确。
- (1)创建仓库
- 创建仓库后,在权限列表中就会有和该仓库相关的权限(增、删、改、查)。
- (2)创建角色,将需要的权限赋给该角色。
- (3)创建用户,将需要的角色付给用户
1
# #