- 首先私服是一种衍生出来的特殊的Maven远程仓库,构建私服的好处请看3.5私服
- 可以帮助大家建立私服的仓库管理软件:Apache基金会的Archiva,JFrog的Artifactory,Sonatype的Nexus,其中Nexus最流行。
1Nexus简介
- Nexus的诞生也是因为受不了外网的慢速度,所以通过开发web应用把已下载构件缓存起来,下次下载直接从缓存处获取。
- Nexus分为专业版(收费)和开源版(免费)
开源版特性: - 较小的内存占用(最少28MB)
- 基于ExtJS的友好界面
- 基于Restlet的完全REST API
- 支持代理仓库、宿主仓库和仓库组
- 基于文件系统,不需要数据库
- 支持仓库索引和搜索
- 支持从界面上传Maven构件
- 细粒度的安全控制
2安装Nexus
Nexus是典型的Java Web应用,他有两种安装包,一种是包含Jetty容器的Bundle包,另一种是不包含Web容器的war包。
2.1下载
下载,下载oss版
版本:nexus-3.1.0-04-win64.zip
jdk要求:1.8及以上。
解压后有两个目录(安装目录、数据目录)
nexus-3.1.0-04-win64下文件
- (安装目录)nexus-3.1.0-04:该目录包含了Nexus运行所需要的文件,如启动脚本,依赖jar包等。(所有相同版本nexus中该目录内容相同)
目录内容及解释:
LICENSE.txt
NOTICE.txt
bin
deploy
etc
lib
public
system
The installation directory includes a number of nested directories:
LICENSE.txt and NOTICE.txt
contain legal details about the license and copyright notices.
bin
contains the nexus
startup script itself as well as startup-related configuration files.
etc
contains configuration files.
lib
contains binary libraries related to Apache Karaf.
public
contains public resources of the application.
system
contains all components and plugins that constitute the application.
- (数据目录)sonatype-work:该目录包含Nexus生成的配置文件、日志、仓库文件等。(需要备份时备份该目录就行)
2.2常见命令
如使用命令行请使用管理员权限打开
2.2.1配置成服务
- 原因:
在生产中使用安装Nexus Repository Manager时,必须将其配置为作为服务运行,以便在服务器重新启动后重新启动。 官方文档提供了各平台的配置。 - Running as a Service on Windows
使用管理员身份打开命令行
nexus.exe /install <optional-service-name>
默认服务名称为nexus。
安装成功
Paste_Image.png
在系统的服务中可以看到:
nexus安装成系统服务配置成随系统启动
配置随系统启动操作服务的其命令
nexus.exe /start <optional-service-name> 开启服务,(也可以在winds的服务界面操作)
nexus.exe /stop <optional-service-name>
nexus.exe /uninstall <optional-service-name> 卸载服务。
2.2.2启动nexus
启动成功,默认端口8081.登录界面,http://localhost:8081/
启动成功登录后界面方案一
如果你将nexus配置成服务后,1.进入界面系统服务界面,直接启动服务后就可以,或者在命令行采用nexus.exe /start nexus,启动服务。
方案二(推荐方案一)
如果你没有将nexus配置成服务,则需要手动到命令行执行启动命令:
进入到bin/目录下
nexus.exe /run
出现下面文字就启动成功
Started Sonatype Nexus OSS 3.1.0-04
其它命令
nexus.exe start
nexus.exe stop
nexus.exe restart
2.2.3停止nexus
同样如果是配置成系统中的服务,则关闭服务就行,否则直接在命令行执行Ctr+C
2.2.4登录
进入nexus后,输入账号密码登录,admin/admin123
nexus的界面2.2.5提示
为了在命令行中方便使用nexus.exe命令可以将其配置在系统环境变量中。
3Nexus的仓库与仓库组
Nexus包含了各种类型的仓库概念,包括代理仓库(proxy)、宿主仓库(hosted)、仓库组(group)、虚拟仓库(virtual)。每一种仓库都提供了丰富实用的配置参数,用户根据需求定制。
3.1Nexus内置的仓库
-
对于4种类型的仓库,Maven内置了一些仓库,这些仓库用户可以不用在配置了。每个仓库的格式为maven2或maven1,此外仓库还有一个属性Policy(策略),表示仓库为发布(Release)版本还是快照(Snapshot)版本仓库。
- 代理仓库主要是提供下载缓存构件和插件、如果只是从远程仓库下载构件和插件、那么代理仓库完全足够。
- 宿主仓库主要用于存放项目部署的构件或者第三方构件。
- 仓库组将相同策略的仓库聚合,并通过一致的地址提供服务。(因为项目有可能依赖的中央仓库的release插件和某个宿主仓库中release的插件,为了方便可以配置仓库组作为仓库,而不去单独配置两个仓库)。
-
对于格式为maven1的仓库和虚拟类型的仓库不做介绍,这两种都是为maven1服务的。
-
Maven Central: 代理中央仓库、策略为Release、只会下载和缓存中央仓库中的发布版本构件。
-
Release: 策略为Release的宿主仓库、用来部署组织内部的发布版本内容。
-
Snapshot: 策略为Snapshot的宿主仓库、用来部署组织内部的快照版本内容。
-
3rd party: 策略为Release的宿主仓库类型、用来部署无法从公共仓库获取的第三方发布版本构件、如oracle连接驱动jar包。
-
ApacheSnapshot: 策略为Snapshot的代理仓库、用来代理ApacheMaven仓库的快照版本构件。
-
Codehaus Snapshots:这是一个策略为Snapshot的代理仓库,用来代理Codehaus Maven仓库的快照版本构件。
-
Google Code:这是一个策略为Release的代理仓库,用来代理Google Code Maven仓库的发布版本构件。
-
PublicRepositories:该仓库将上述所有策略为Release的仓库聚合并通过一致的地址提供服务。
-
Public Snapshot Repositories:该仓库将上述所有策略为Snapshot的仓库聚合并通过一致的地址提供服务。
3.2案例理解概念
公司内部建立Nexus私服为公司项目提供服务,公司Maven项目X。
-
X依赖开源类库如JUnit类,这些构件可以从Maven中央仓库获得,因此Maven Central代理仓库会被用来代理中央仓库的内容,并在私服上缓存下来。
-
X还来依赖与Google Code的某个项目,其构件不在中央仓库,只存在于Google Code仓库中,所以Google Code代理仓库会被用来缓存这样的构件。
-
X还依赖于Oracle的JDBC驱动,由于版权原因,该类库无法从公共仓库获得,因此公司管理员将其部署到3rd party宿主仓库中,供X使用。
-
X的快照版构件成功后会被部署到Snapshots宿主仓库中,供其他项目使用,当X发布正式版本的时候,其构件会被部署到Release宿主仓库中。
-
由于X用到了上述列表中的很多仓库,为每个仓库声明Maven配置又比较麻烦,因此可以直接使用仓库Public Repositories和Public Snapshot Repositories。当X需要JUnit的时候,她直接从PublicRepositories下载,Public Repositories会选择Maven Central提供实际的内容。
3.3Nexus仓库分类的概念
Maven可以直接从宿主仓库下载构件,也可以从代理下载,为了方便还可以从仓库组下载构件,仓库组没有时间内容,它会转向其包含的宿主仓库或者代理仓库获取实际的构件。
各种类型的Nexus仓库3.4创建Nexus仓库
创建按钮 选择仓库格式和类型3.4.1宿主仓库配置信息
宿主仓库配置信息3.4.2代理仓库配置信息
代理仓库配置信息案例
- 发生错误条件:第一次搭建nexus私服在局域网内的一台服务器上,而且那台服务器没有连接外网,所以私服上还没有任何构件。局域网中的A电脑进行了下面操作,A在本地maven仓库之前已经有了maven-reporting-api构件,通过镜像配置本地maven项目从私服获取所有构件,然后执行mvn clean deploy出现以下错误。下面是一种错误分析。
-
错误分析:(正确,测试过)
a. 根据提示说明本地缓存了这个错误,解决方法由两个: -
一是等maven检查远程仓库的更新间隔时间到了(更新间隔时间是maven从远程仓库(nexus)检查最新构件的更新策略updataPolicy。默认一天检查一次。详细请看maven---6仓库--->4远程仓库配置)。
-
另一个是强制让maven检查远程仓库进行更新,即不再等它时间到,使用参数U来强制更新。
-
解决步骤:(如果解决不了看下面)
- 1.让私服连接上外网,在本地仓库中删除掉maven-reporting-api构件。
- 2.执行mvn clean deploy -U
-
再解决
如果上面的1,2执行完后没解决。那么应该是nexus上远程代理仓库在没有网的情况下下载构件,但是下载失败了,而nexus代理仓库对“没找到构件”这种情况会缓存一天(看3.4.2代理仓库配置信息),所以即使你本地按照上面设置了,但是nexus这里依然给你它缓存的结果。进行下面的设置后在执行上面2个步骤,即可解决。- 1.到nexus上设置要访问的远程代理仓库对待“没有发现构件的缓存时间设为0”。
- 再次执行mvn clean deploy -U,就可以了。
3.4.3仓库组配置信息
仓库组配置信息4配置Maven从Nexus下载构件
4.1确定nexus上仓库的地址。
获取要配置nexus仓库的地址http://localhost:8081/repository/maven-public/
4.2在单个maven项目中配置
- 在需要的maven项目中配置pom.xml文件。
maven---6仓库--->4.远程仓库配置
maven---7生命周期和插件--->8.1插件仓库
中介绍了在maven项目中配置仓库和插件仓库。
问题:这种配置只针对当前maven项目有效,对于电脑上的其它maven项目还需要重新配置自己的pom
4.3配置全局范围(推荐)
- 想通过一次配置就让本机所有maven项目都使用自己的私服。答案:在setting.xml中配置。
4.3.1在setting中配置访问私服(方法一)
- settings.xml中不能配置repositories和pluginRepositories,但是提供了Profile机制,能让用户将仓库配置放到settings.xml中的Profile中。
<settings>
...
<!--配置Nexus仓库-->
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://localhost:8081/repository/maven-public/</url>
<layout>default</layout>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://localhost:8081/repository/maven-public/</url>
<layout>default</layout>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!--激活Nexus仓库配置 -->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
...
</settings>
- 配置中使用一个id=nexus的profile,这个profile包含了相关的仓库配置,同时使用activeProfile元素将这个profile激活。
4.3.2通过镜像配置私服(方法二)(推荐)
- 通过(方法一)在settings.xml配置私服仓库后,项目依然会时不时访问中央仓库和maven项目中配置的其它远程仓库,而不是全部访问私服,此时就需要配置镜像。maven---6仓库--->7镜像
- 让所有对远程仓库(不论是中央仓库还是第三方仓库如:JBoss Maven库)的请求都转到nexus仓库,同时nexus的仓库组要包含所有maven项目需要请求的代理仓库(即需要的代理所有需要的远程仓库)。
同样在settings.xml中配置镜像:
<settings>
...
<!--配置镜像-->
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>nexus mirror for all repositry</name>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
<!--配置Nexus仓库-->
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots><enabled>true</enabled> </snapshots>
<releases><enabled>true</enabled> </releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central pluginRepository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots><enabled>true</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!--激活Nexus仓库配置 -->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
...
</settings>
解释
- 问:配置的镜像*会拦截所有的仓库请求,为什么还要配置central的仓库及插件仓库呢?
- 答:1.首先仓库名称取为central,会覆盖超级Pom中的中央仓库配置。2.由于所有仓库请求都转向了镜像配置的地址,所以配置的仓库和插件仓库的url无效。3.主要目的:开启对快照版本下载的支持,当Maven需要下载发布版或者快照版构件的时候,它首先检查central,看该类型构件是否支持,得到正面回答后,再根据镜像匹配规则转而访问私服仓库地址。(此时私服仓库有可能支持快照也有可能不支持,主要看私服仓库配置)。
5部署构件至Nexus
5.1需求说明
- 对于Nexus的宿主仓库,他们的主要作用是存储组织内部的,或者一些无法从公共仓库获得的第三方构件,供大家下载,所以需要1.配置maven自动不熟构件到nexus的宿主仓库中。2.或者通过界面手动上传构件。
5.2部署Maven项目构件至Nexus
开发生成的快照版本部署到Nexus中策略为Snapshot的宿主仓库中,项目正式发布的构件则应该部署到Nexus中策略为Release的宿主仓库中。
5.2.1获取Nexus中确定要部署的宿主仓库的连接
要部署到的远程仓库http://localhost:8081/repository/maven-releases/
http://localhost:8081/repository/maven-snapshots/
5.2.2配置项目pom
<!--配置项目生成的构件部署到Nexus私服上 -->
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus ReleaseRepository</name>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus SnapshotsRepository</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
5.2.3在settings.xml配置仓库认证信息
因为不是所有人都可以部署构件到nexus仓库中的,关于认证信息就是拥有管理该仓库的用户,在下面有讲。
<settings>
....
<servers>
<!--配置nexus仓库认证信息-->
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>****</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>****</password>
</server>
</servers>
...
</settings>
5.2.4使用mvn命令
在项目根目录下执行部署命令,或者在开发工具中执行部署命令
mvn clean deploy
5.3手动部署第三方构件至Nexus仓库
- 对于一些开源或者有版权的jar文件,他们在远程仓库没有,所以只能将他们先下载下来,再手动上传到nexus私服上。
5.3.1确定Nexus中要部署的3rd-party宿主仓库连接
该宿主仓库一般转为用来存放第三方构件的仓库。
Paste_Image.png
http://localhost:8081/repository/3rd-party/
5.3.2在settings.xml配置3rd-party仓库认证信息
该信息在下面使用
<server>
<id>nexus-3rd-party</id>
<username>admin</username>
<password>admin123</password>
</server>
5.3.3命令行部署到nexus上
通过命令行来操作部署G:\5jar\edu.mit.jwi_2.3.3_jdk.jar目录下的jar包到nexus的3rd-party仓库中。
其中需要你自定义groupId,artifactId,version,packaging信息。其中的-Dfile填写jar的位置,-Durl填写nexus中3rd-party的连接,-DrepositoryId填写在settings.xml配置的认证信息的id。
mvn deploy:deploy-file -Dfile=G:\5jar\edu.mit.jwi_2.3.3_jdk.jar -DgroupId=local.edu.stanford -DartifactId=edu.mit.jwi_jdk -Dversion=2.3.3 -Dpackaging=jar -Durl=http://localhost:8081/repository/3rd-party/ -DrepositoryId=nexus-3rd-party
部署成功
手动部署到3rd-party仓库的构件
- 3rd-party仓库设置了相同依赖不允许重复部署,所以再次部署会失败。
关于部署第三方构件到本地仓库,请查看maven---6仓库---->3.2.2.3安装第三方构件到本地仓库
6Nexus的权限管理
6.1需求
处于安全考虑,在组织内部中如果希望只有管理员才能配置Nexus,只有某些团队成员才能部署构件,或者更细要求,例如每个项目都有自己的Nexus宿主仓库,且只能部署项目构件至该仓库,Nexus提供了全面的权限控制特性,能让用户自由根据需求配置Nexus用户(user)、角色(role)、权限(privilege).
6.2介绍
nexus操作界面6.1.1权限privilege
- Nexus是基于权限(privilege)做访问控制的,服务器每一个资源都有相应的权限来控制,用户只需特定操作必要拥有必要的权限。
6.1.2角色(role)
- 管理员必须以角色(role)的方式将权限赋予Nexus用户,例如访问nexus中搜索页面需要nx-search-read权限,而nexus中配置的角色nx-anonymous角色就拥有该权限,将这个角色分配给某个用户就可以访问nexus中搜索页面了。角色还可以包含一个或多个角色。
6.1.3用户(user)
-
用户可以被赋予一个或多个角色,角色可以包含一个或者多个权限,角色可以包含一个或多个其它角色。
用户
7Nexus的调度任务
- Nexus提供了一系列可配置的调度任务来方便用户管理系统,用户可以设定这些任务运行方式,例如:每天、每周、手动等,任务调度会在适当的时候在后台运行,当然用户还是能够在界面观察他们的状态。
-
Nexus包含了以下几种类型的调度任务:
任务类型
-
创建任务
Nexus管理界面左边最下方
8其他私服软件
还没接触....
留言
有什么不懂的一起探讨一下吧,欢迎留下宝贵意见,喜欢就点个赞吧(哈哈),多谢鼓励。
网友评论