Nexus
是
Maven
仓库管理器,用来搭建一个本地仓库服务器,这样做的好处是便于管理,节省网络资源,速度快,还有一个 非常有用的功能就是可以通过项目的
SNAPSHOT
版本管理,来进行模块间的高效依赖开发,下面会一一描述。
虽然你可以通过中央仓库来获取你所需要的
jar
包, 但是现实往往是存在很多问题:
- 网速慢,你可能需要花很长的时间来下载你所需要的
jar
- 如果你的公司很大,有几百甚至几千人再用
Maven
,那么这些人都去通过中央仓库来获取
jar
,那么这是一个很大的资源浪费
- 如果存在模块之间的依赖开发,你的
snapshot
版本是不能够被你的伙伴很方便的获取。
- 在实际开发过程中,有些
jar
的 版本可能在中央仓库里面不存在,或者更新不及时
,你是获取不 到这个
jar
的。
所有以上问题,通过
Nexus
这 个日益流行的仓库管理器可以轻松的解决。
-
- 这个仓库是本地的,下载的速度是从远程下载不可比的。
- 可以为你公司所有的
Maven
使用者服务,可以进行统一管 理
- 后面我会介绍如何通过
nexus
来进行存在模块依赖的项目的 开发
- 你可以添加自己的第三方包。
- 这个仓库是本地的,下载的速度是从远程下载不可比的。
安装
Nexus
我们从
http://nexus.sonatype.org/downloads/
来获取最新版本,目前最新版本为
1.3.4
Nexus
提供了两种安装方式,一种是内嵌
Jetty
的
bundle
,只要你有
JRE
就能直接运行。第二种方式是
WAR
,你只须简单的将其发布到
web
容 器中即可使用。
1
)
Bundle
方式安装
解压
nexus-webapp-1.3.
4
-bundle.zip
至任意目录,如
D:/
tools
,
转 到
目录
D:/
tools/nexus-webapp-1.3.
4
/bin/jsw/windows-x86-32
,运行
Nexus.bat
, 如果你是在
linux下安装,那么就下载
nexus-webapp-1.3.
4
-bundle.
tar
.gz,
解压后转到${NEXUS_HOME}/
nexus-webapp-1.3.3/bin/jsw/linux-x86-32
,它还支持solaris,macos等操作系统
。当你看到“Started SelectChannelConnector@0.0.0.0:8081”之后,说明Nexus启动成功了,然后打开浏览器,访问 http://127.0.0.1:8081/nexus,
通 过admin的帐号
(admin)和密码 (admin123)登录
你会看到如下的页面:
如果有新版本发布,会有提示在默认页面上。
这里,可以管理仓库,配置
Nexus
系统,管理任务,管理用户,角色,权限,查看系统的
RSS
源,管理及查看系统日志,等等。
War
方式安装
你可以同过
war
的 方式以
web
应用的形式发布到你的应用服务器,比如
tomcat
。你所要做的就是下载
war
版 本的文件,然后放到应用服务器的发布目录即可,这里就不多讲了。
到此我们已经安装好
Nexus,
下面我来介绍下一些我们常用的功能和使用:
配置
中央仓库
先看一下界面:
在左边菜单栏里选择
Repositories
,然后会出现右边的画面,右边上半部分是列出来的
repository
,黑体字是类型为
group
的
repository.
这里简单介绍下几种
repository
的类型
:
- hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。
比如公司的第二方库
。
- proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
- group,仓库组,用来合并多个hosted/proxy仓库,
当你的项目希望在多个
repository使用资源时就不需要多次引用了,只需要引用一个group即可。
Maven central是Maven的中央仓库,点击它并选择configuration标签栏,我们会看到下面的页面:
这里有几个项目是我们可能会经常用到的:
- 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, 3
rd
Party.
分别讲一下这三个预置的仓库都是做什么用的
:
- Releases:
这里存放我们自己项目中发布的构建
,
通常是
Release
版本的
,
比如我们自己做了一个
FTP Server
的项目
,
生成的构件为
ftpserver.war,
我们就可 以把这个构建发布到
Nexus
的
Releases
本地仓库
.
关于符合发布后面会有介绍
.
- Snapshots:
这个仓库非常的有用
,
它的目的是让我们可以发布那些非
release
版本
,
非稳定版本
,
比如我们在
trunk
下开发一个项目
,
在正式
release
之前你可能需要临时发布一个版本给你的同伴使用
,
因为 你的同伴正在依赖你的模块开发
,
那么这个时候我们就可以发布
Snapshot
版本到这个仓库
,
你 的同伴就可以通过简单的命令来获取和使用这个临时版本
.
- 3
rd
Party:
顾名思义
,
第三方库
,
你可 能会问不是有中央仓库来管理第三方库嘛
,
没错
,
这里的是指可以让你添加自己的第三方库
,
比 如有些构件在中央仓库是不存在的
.
比如你在中央仓库找不到
Oracle
的
JDBC
驱 动
,
这个时候我们就需要自己添加到
3rd party
仓库
.
- 你也可以创建自己的本地仓库,点击
Repository
面板上方的
Add
按钮,然后选择
Hosted Repository
,然 后在下方的配置面板中输入相关信息
,
这里我们不再需要填写远程仓库地址,根据自己的需要选择
Release
或者
Snapshot
,如图:
Maven
仓库组
仓库组的概念是
Maven
没 有的
,
通过前面介绍可以了解到
,
我们可以建立多个
proxy
代理仓库
,hosted
本地仓库
,
如果没有仓库组的概念
,
我们 如果需要引用这些仓库的是时候需要一一加入到我们的
setting.xml
里面去
,
有了仓库的组的概念
,
我 们只需要做一次引用就可以了
,
把我们需要的仓库加入到仓库组即可
.
像这样
:
<repositories>
<repository>
<id>nexus</id>
<url>http://
127.0.0.1
:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
Nexus
中预设了
2
个仓库组
,
public repositories
和
public snapshot repositories.
如图
:
这个仓库组默认包含本地仓库
Releases, snapshots, 3
rd
party
和代理仓库
Maven Central.
你可以在
Configuration
配置页添加仓库到这个仓库组
.
如果需要你还可以创建一个仓库组
,
如图
:
点击
Add->Repository Group
出现
New Repository Group
界面后
,
填入
ID, name
等相关信息
,
在 右边
Available Repositories
栏里可以选择你要添加的仓库
到你
新建的仓库组
.
通过
Nexus
搜索构件
在我们实际使用构件的过程中通常遇到一个问题
,
有时 候我紧紧知道我所需要的构建的大致名字
,
并不知道全称或
group id,
这是件非常头疼的事 情
. Nexus
基于
Nexus indexer
的搜索功能帮我们解决了这个问题
.
要是用搜索功能
,
必须 要有索引文件
,
Nexus
默 认是不建立索引文件的
,
因为像中央仓库这样的索引文件的建立需要耗费比较大的网络资源
,
仅索 引文件就要几十兆
.
要开启中央仓库的索引文件下载功能需要在
Maven Central
的配置页面
,
把
Download Remote Indexes
选择
true.
如图
:
这样设置以后
, Nexus
会自动从远程中央仓库下载索引文件
,
为了检验索引文件自动下载是否生效
,
可以却换到
Browse:
如果出现先以上文件夹
,
那说明 索引文件已经建立
.
下面我试一下搜索功能
,
在左 边菜单栏里面有个
Artifact Search,
在输入框里面输入你想要搜索的构件名字
,
比如
:
testing
,
那 么查询结果如下:
这是模糊查询的结果,当然如果你知道更多信息,比如版本号等,你 可以使用高级搜索,点击高级搜索后,右边界面会提供集中搜索方式:
keyword, classname, GAV, checksum
比如我们这里选择
GAV
模 式
,
而且我只知道
artiface name : testng
和版本号
5.8,
其他的我不知道
,
那么就在
artifact
和
version
处分别输入
testng
和
5.8 ,
搜索结果如下
:
你如果你不知道知道构件的名称
,
只 知道
classname,
那么你也可以通过
class name
的方式搜索
,
这里 就不再
赘述
当你选择一项搜索结果
,
在页面 的下方会出现这个构件的详细信息
,
并且会列出这个构件的
Maven
依赖配置
,
你 可以直接拷贝到你的
pom
文件中使用
,
这是个非常实用的功能
:
在
Maven
中使用
Nexus
到此为止我们介绍了如何安装和使用
Nexus
以及其基本配置
,
下 面我们介绍下如何让
Maven
来使用
Nexus
本地仓库用来替代使用远程仓库
.
在
Maven
使用
Nexus
本地仓库只需稍作配置
,
在
settings.xml
中加入以下代码
:
<profile>
<id>dev</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://
127.0.0.1
:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<url>http://127
.
0.0.1:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
这里配置了
repository
和
pluginRepository, Maven
在使用第三方构件和插件时是分开来配置的
,
所以 如果我们也希望插件的下载也通过我们的本地仓库来下载
,
那么我们就需要配置
pluginRepository.
红色字体部分就是我们之前安装的
Nexus
的地址
,
这个地址可以是你们公司局域网内部的一台仓库服务器
.
<releases> <enabled>true</enabled></releases>
这个标签的作用是设定是否允许
下载
release
版本
的
载构件
,
同样
snapshots
标签可以设定是否允许
下载
snapshot
版本
的构件
.
通常
,
我们不建议下载
snapshot
版本的构件
,
因为它是不稳定的版本
,
除非你有特殊的需
求
.
构件部署
有些时候我们需要部署构件到
Nexus
的
3rd party,
比如我们在中央仓库找不到我们需要的构件
,
我们可以通过
Nexus
的
UI
来上传构件
:
点击左边菜单栏的
Repositories,
然后点击右边界面的
3rd party,
选择界面下方的
Artifact Upload,
这个时候出现以下界面
:
上传构件需要两个步骤
,
一个是 定义文件的上传
,
再就是构件的实体文件
.
第一部分定义文件可以是
POM
文 件
,
这也是比较推荐的方式
,
如果没有
pom
文 件
,
可以
选择以参数的形式输入
.
第二部分是上传构件的实体文件
,
这里 简单说一下
Classifier
和
Extension,
这两个都是选
填相
, Classifier
用来区别同功 能的构件用于不同的场景
,
比如这个构件是分别针对
JDK14
和
JDK15
做了
2
个功 能一样的
Jar,
这个时候你就需要指定这个构件的
Classifier
为
JDK14
还是
JDK15. Extension
是指 扩展名
,
如果不提供
,
那么会自动取这个构件的
Packaging Type
作为扩展名
,
比如
ear, jar, war
等等
.
(Packaging Type
是在第一步中通过
pom
文件或者手
工输入得到的
)
刚才说了
3rd party
的部署
,
关于
releases
和
snapshots
的
UI
部署也是一样的操作过程
.
我们之前也讲过
,
这里 的
releases
和
snapshots
是用来部署我们自己的项目构件的
,
通过
UI
部署是可以
,
但是不是最高效的
,
我们可以通过配置
Maven
来自动部署我们的项目构
件
,
这也是我们建立自己的仓库的一个非常 重要的原因
,
下面就让我们看看如何配置
:
首先需要在
POM
文 件中加入以下代码
:
- <project>
- …
- <distributionManagement>
-
<repository>
-
<id>
nexus-releases
</id>
-
<name>
Nexus
Release
Repository
</name>
-
<url>
http://127.0.0.1:8081
/nexus/content/repositories/releases/
</url>
-
</repository>
-
<snapshotRepository>
-
<id>
nexus-snapshots
</id>
-
<name>
Nexus
Snapshot
Repository
</name>
-
<url>
http://127.0.0.1:8081
/nexus/content/repositories/snapshots/
</url>
-
</snapshotRepository>
- </distributionManagement>
- …
- </project>
这里配置
,
让
Maven
知道当我要发布
release
版本或者
snapshot
版本是需要发布到哪个地址
.
然后我们需要在
setting.xml
里面配置一下
Nexus
的帐号和密码
:
- <settings>
- …
- <servers>
-
<server>
-
<id>
nexus-releases
</id>
-
<username>
admin
</username>
-
<password>
admin123
</password>
-
</server>
-
<server>
-
<id>
nexus-snapshots
</id>
-
<username>
admin
</username>
-
<password>
admin123
</password>
-
</server>
- </servers>
- …
- </settings>
到此为止
,
我们 就可以通过命令
mvn deploy
或者通过
IDE
的可视化界面点击
deploy
来发布我们项目到本地仓库了
.
通 过这种方式我们可以很方便的进行模块间的依赖开发
,
在后面的文章中我会详细介绍如何通过
snapshot
来让我们的依赖开发变 得简单
.
小结
本文介绍了
Maven
仓 库
,
如何通过
Nexus
建立自己本地仓库
,
通过和远程仓库的比较
,
我 们知道
Nexus
给我带来很多方便之处
,
方便我们管理
,
方 便我们的项目构件部署
,
项目的依赖开发等
.
还在等什么
,
创 建你自己的仓库吧
.