前面的文章中我们了解到maven的仓库一共有三种:
1.中央仓库
2.私有仓库
3.本地仓库
一般情况下 是本地仓库从中央仓库直接下载 依赖包,但是因为网速等问题影响常常出现下载包失败或者因为中央仓库包的版本缺少下载不到包的情况,这种时候,就体现到了nexus私有仓库的好处。我们来了解一下nexus私有仓库。
nexus介绍
nexus其实是一个仓库管理器,可以帮助我们在本地架设一个 Maven仓库服务器。
说的通俗一点儿,就是在本地maven仓 库和中央仓库之间再建一个中间仓库,本地仓库如果需要下载构件可以先去这个仓库管理器获取,如果仓库管理器有了那么直接就可以用,如果仓库管理器没有那么 由它去中央仓库获取。通常,在一个公司内部,可以创建公司级的仓库管理器,相当于一个公司只有这个仓库管理器去和中央仓库打交道,而这个仓库管理器通常设 置在公司内网,大大减轻了从中央仓库获取构件的带宽和不必要的磁盘浪费。
nexus还提供了强大的仓库管理功能,构件搜索功能,它基于REST,友好的UI是一个extjs的REST客户端,它占用较少的内存,基于简单文件系统而非数据库。这些优点使其日趋成为最流行的Maven仓库管理器。
nexus安装
下载
地址:http://www.sonatype.org/nexus/go
安装
下载完,解压缩后可以看到两个文件夹,一个是nexus-2.11.0-02,另一个是sonatype-work,我们只需要将nexus-2.11.0-02拷贝到需要安装的路径即可,比如在我的机器上,我新建了一个nexus文件夹,把nexus-2.11.0-02拷贝了进去,sonatype-work可以不拷贝。
很简单,这就安装完了。
PS:
如果你是在linux下安装,那么就下载nexus-webapp-1.3. 4 -bundle. tar .gz, 解压后转到${NEXUS_HOME}/ nexus-webapp-1.3.3/bin/jsw/linux-x86-32,它还支持solaris,macos等操作系统。
也可以通过war包运行形式安装,war的方式以web应用的形式发布到你的应用服务器,比如tomcat。你所要做的就是下载war版本的文件,然后放到应用服务器的发布目录即可
启动
nexus已经将各个平台的启动脚本都写好了,并分开目录放置,具体可以查看nexus-2.11.0-02\bin\jsw目录,我的机器是 windows64位的,就可以进入到windows-x86-64目录下,点击console-nexus.bat即可启动,启动完成后,访问 url:http://localhost:8081/nexus即可看到nexus的页面nexus2如果是其他平台,找到对应的目录启动脚本即可。
仓库配置
通过浏览器访问到nexus的管理界面:http://localhost:8081/nexus。管理员登陆密码默认为:admin/admin123
输入用户名密码登陆进去之后,看到如下界面:
左侧分为4部分,其中views/repositories是仓库相关的管理项;security是安全权限相关的;administrotr是管理相关的;help是帮助相关的。
仓库浏览
点击左侧的“views/repositories–>repositories”,右边列出来了nexus默认的仓库nexus4其中有四种类型的仓库,分别是hosted、proxy、virtual、group
hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
group,仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。
hosted,宿主型的,实实在在由nexus给管理的仓库,nexus自带了3个宿主仓库nexus5proxy,代理型的,每个仓库都是对一个远程仓库的代理,这其中就包括了对中央仓库的代理nexus6virtual,虚拟型的,这个不太了解,就不说了group, 严格来说它不是一个仓库,顾名思义,是组的意思,它相当于是由多个仓库合成了一个组,由该组的url对外提供服务,nexus默认有两个组,一个是 public group,其中包含了上边的3个宿主仓库和中央仓库;另一个是public snapshots group,里边包含了Apache Snapshots和CodeHaus Sanpshots。当然这些组包含的内容是可以修改的。
同时,nexus提供了增加、删除、修改仓库定义的功能。
打开远程仓库索引下载
上一篇文章咱们也提到了,巨大的用户访问中央仓库会带来巨大的网络压力和服务器压力,因此在nexus中默认的各个代理仓库的索引都是关闭状态,即 安装完nexus后里边是空的,什么东东都没有,包括索引。我们现在要做的就是需要把这个索引给下载到nexus服务器中,以便使用者可以从nexus中 搜索到相关构建。
方法如下:
- 选中中央仓库这条记录,即名字为central的仓库下边选中configuration选项卡,找到其中的Download Remote Indexes,把fasle改为true,并保存在上边的中央仓库记录上点击右键,选择update index
-
- 下载完成后
- 然后在下边选中Browse Index选项卡,打开central这颗树的节点,应该能看到内容。在下载索引之前是空的。
- 变成了
而且对构件进行搜索 已经能搜索到内容了
其他的proxy类型的仓库,都可以用同样的方法来下载索引。注意:这一步仅仅是下载了远程仓库的索引,真正的构件还没有下载到nexus中。等真正有实际用户使用这些构件的时候,才会从中央仓库下载真实的构件文件。
PS:有可能下载不下来,这种情况是自带的中央仓库链接已经改版
访问一下这个链接,发现已经改版了,但是httpclient不能自动处理重定向
解决方案
nexus私服update index失败解决方案
这里有几个项目是我们可能会经常用到的:
Override local storage location: 在这个选项你可以配置你的Nexus本地仓库的存放地址,用来覆盖其默认的存放地址
Remote storage location: 这里是远程仓库的地址,为了提高代理速度,你可以修改为国内的镜像地址。默认值是http://repo1.maven.org/maven2/
Download remote indexes: 这里配置是否下载远程索引文件,模式是false, 建议配置为true,这样我们便可以通过索引文件来搜索我们需要的构件
添加代理仓库
通常情况下,使用预设的代理仓库已经能够满足大部分项目的需求了, 只有在特殊需求的情况下才会参加代理仓库.
Maven central是一个比较大的代理仓库,如果你需要添加的一个代理仓库,那么可以在点击左边惨淡栏里面的Repositories,然后右边的页面点击add -> add proxy repository, 之后出现以下页面:
填写相关信息保存即可。
管理本地仓库
我们前面讲到类型为hosted的为本地仓库,Nexus预定义了3个本地仓库,分别是Releases, Snapshots, 3rd Party. 分别讲一下这三个预置的仓库都是做什么用的:
Releases: 这里存放我们自己项目中发布的构建, 通常是Release版本的, 比如我们自己做了一个FTP Server的项目, 生成的构件为ftpserver.war, 我们就可以把这个构建发布到Nexus的Releases本地仓库. 关于符合发布后面会有介绍.
Snapshots: 这个仓库非常的有用, 它的目的是让我们可以发布那些非release版本, 非稳定版本, 比如我们在trunk下开发一个项目,在正式release之前你可能需要临时发布一个版本给你的同伴使用, 因为你的同伴正在依赖你的模块开发, 那么这个时候我们就可以发布Snapshot版本到这个仓库, 你的同伴就可以通过简单的命令来获取和使用这个临时版本.
3rd Party: 顾名思义, 第三方库, 你可能会问不是有中央仓库来管理第三方库嘛, 没错, 这里的是指可以让你添加自己的第三方库, 比如有些构件在中央仓库是不存在的. 比如你在中央仓库找不到Oracle 的JDBC驱动, 这个时候我们就需要自己添加到3rd party仓库.
你也可以创建自己的本地仓库,点击Repository面板上方的Add按钮,然后选择Hosted Repository,然后在下方的配置面板中输入相关信息, 这里我们不再需要填写远程仓库地址,根据自己的需要选择Release或者Snapshot。
Maven 仓库组
仓库组的概念是Maven没有的,通过前面介绍可以了解到, 我们可以建立多个proxy代理仓库,hosted本地仓库, 如果没有仓库组的概念,我们如果需要引用这些仓库的是时候需要一一加入到我们的setting.xml里面去, 有了仓库的组的概念, 我们只需要做一次引用就可以了,把我们需要的仓库加入到仓库组即可.像这样:
nexus
http://localhost:8081/nexus/content/groups/public/
true
true
这里的url对应图中的url
我们需要用哪一个就填哪一个的url
Nexus中预设了2个仓库组,public repositories和public snapshot repositories. 如图:
仓库组默认包含本地仓库Releases, snapshots, 3rd party和代理仓库Maven Central. 你可以在Configuration配置页添加仓库到这个仓库组. 如果需要你还可以创建一个仓库组,如图:
点击 Add->Repository Group
出现New Repository Group界面后,填入ID, name 等相关信息, 在右边Available Repositories 栏里可以选择你要添加的仓库到你新建的仓库组.
设置完之后我们就可以在maven项目中引用nexus私服了。
部署构件至Nexus
导入本地仓库中的构件
经过上面的步骤,我们已经部署好了nexus的私服,如果我们之前本地项目下载了一些常用的jar包(构件),就可以直接复制到 私服的仓库目录中,这样就不用再去下载一次了。
首先确认一下 nexus私服仓库的路径
找到本地仓库
把repository文件夹复制过来即可
通过Nexus UI部署
有时候有个jar文件你无法从公共Maven仓库找到,但是你能从其它得到这个jar文件(甚至是POM),那么你完全可以将这个文件部署到Nexus中,使其成为标准流程的一部分。步骤如下:
点击左边导航栏的"Repository",在右边的仓库列表中选择一个仓库,如“3rd Party”,然后会看到页面下方有四个tab,选择最后一个“Upload”,你会看到构件上传界面。选择你要上传的构件,并指定POM,(或者手工编写GAV等信息),最后点击Upload,该构件就直接被部署到了Nexus的"3rd Party"仓库中。如图:
通过Maven部署添加
更常见的用例是:团队在开发一个项目的各个模块,为了让自己开发的模块能够快速让其他人使用,你会想要将snapshot版本的构件部署到Maven仓库中,其他人只需要在POM添加一个对于你开发模块的依赖,就能随时拿到最新的snapshot。
以下的pom.xml配置和settings.xml能让你通过Maven自动化部署构件:
pom.xml
...
nexus-releases
Nexus Release Repository
http://127.0.0.1:8080/nexus/content/repositories/releases/
nexus-snapshots
Nexus Snapshot Repository
http://127.0.0.1:8080/nexus/content/repositories/snapshots/
...
settings.xml
...
nexus-releases
admin
admin123
nexus-snapshots
admin
admin123
...
这里我们配置所有的snapshot版本构件部署到Nexus的Snapshots仓库中, 所有的release构件部署到Nexus的Releases仓库中。由于部署需要登陆,因为我们在settings.xml中配置对应Repository id的用户名和密码。
然后,在项目目录中执行mvn deploy ,你会看到maven将项目构件部署到Nexus中,浏览Nexus对应的仓库,就可以看到刚才部署的构件。当其他人构建其项目时,Maven就会从Nexus寻找依赖并下载。
配置Maven使用Nexus
经过上面的步骤,我们已经准备就绪了,现在就可以在maven中调用nexus私服了。
我们可以将Repository配置到POM中,但一般来说这不是很好的做法,原因很简单,你需要为所有的Maven项目重复该配置。因此,这里我将Repository的配置放到$user_home/.m2/settings.xml中:
...
dev
local-nexus
http://127.0.0.1:8080/nexus/content/groups/public/
true
true
dev
...
由于我们不能直接在settings.xml中插入元素,这里我们编写了一个profile,并添加了一个profile并使用元素自动将这个profile激活。这里的local-nexus仓库指向了刚才我们配置的Nexus中“Public Repositories”仓库组,也就是说,所有该仓库组包含的仓库都能供我们使用。此外,我们通过和元素激活了Maven对于仓库所有类型构件下载的支持,当然你也可以调节该配置,比如说禁止Maven从Nexus下载snapshot构件。
使用该配置,Maven就会从你的Nexus服务器下载构件了,速度和从Central下载可不是一个数量级的。
ps:现在也可以使用镜像库,其原理跟私有库是一样的,但是是别人搭建的公有库。
只需要在配置中mirrors里面增加镜像配置即可,例如:
osc
*
http://maven.oschina.net/content/groups/public/