通过建立自己的私服,就可以降低中央仓库负荷、节省外网宽带、加速Maven构建、自己部署构件等,从而有效地使用Maven。Nexus是当前最流行的Maven仓库管理软件。
Nexus简介:
Nexus分为开源版和专业版,其中开源版本基于GPLv3许可证,其特性足以满足大部分Maven用户的需求。以下是一些Nexus开源版本的特性:
- 较小的内存占用(最少仅为28M)
- 基于ExtJS的友好界面
- 基于Restlet的完全REST API
- 支持代理仓库、宿主仓库和仓库组
- 基于文件系统,不需要数据库
- 支持仓库索引和搜索
- 支持从界面上传Maven构件
- 细粒度的安全控制
Nexus专业版是需要付费购买的,除了开源版本的所有特性之外,它主要包含一些企业安全控制、发布流程控制等需要的特性。
安装Nexus:
Nexus是典型的Java web应用,它有两种安装包,一种是包含Jetty容器的Bundle包,另一种是不包含Web容器的war包。
下载Nexus:
从http://www.sonatype.org/下载最新的nexus,当前可以下载最新的Bundle包是nexus-2.9.1-02-bundle.tar.gz或者nexus-2.9.1-02-bundle.zip,也可以下载war包nexus-2.9.1-02.war。
Bundle方式安装Nexus:
Nexus的Bundle自带了Jetty容器,因此用户不需要额外的Web容器就能直接启动Nexus。首先将Bundle文件解压,这时就会得到如下两个子目录:
- nexus-2.9.1-02/:该目录包含了Nexus运行所需要的文件,如启动脚本、依赖jar包等。
- sonatype-work/:该目录包含Nexus生成的配置文件、日志文件、仓库文件等
其中,第一个目录是运行Nexus所必需的,而且所有相同版本Nexus实例所包含的该目录内容都是一样的。而第二个目录不是必需的,nexus会将不同用户在不同机器上使用的Nexus的不同配置和仓库内容放在其中。当用户需要备份Nexus的时候,默认备份sonatype-work/目录,因为该目录包含了用户特定的内容。
在Windows操作系统上,用户需进入nexus-2.9.1-02/bin/jsw/windows-x86-32/子项目,然后直接运行console-nexus.bat脚本就能启动Nexus。
这时,打开浏览器访问http://localhost:8081/nexus/就能看到Nexus的界面。
要停止Nexus,可以在命令行按Ctrl+C键。
在nexus-2.9.1-02/bin/jsw/windows-x86-32/目录下还有其他一些脚本:
- install-nexus.bat:将Nexus安装成Windows服务
- uninstall-nexus.bat:卸载Neuxs Windows服务
- start-nexus:启动Neuxs Windows服务
- stop-nexus:停止Neuxs Windows服务
借助Windows服务,用户就可以让Nexus伴随着Windows自动启动,非常方便。
关于Bundle安装的一个常见问题是端口冲突。Nexus Bundle默认使用的端口是8081,如果该端口已经被其他应用程序占用,或者你想使用80端口开发Nexus服务,则编辑文件nexus-2.9.1-02/conf/plexus.properties,找到属性application-port,按需要将默认值8081改成其他端口号,然后保存该文件,重启Nexus便可。
WAR方式安装Nexus:
Nexus还提供一个可以直接部署到Web容器中的war包。该包支持主流的Web容器,如Tomcat、Glassfish、Jetty和Resin。
以tomcat为例,把war包放在tomcat的webapps目录下,然后启动tomcat。
然后访问http://localhost:8080/nexus/就能看到Nexus的界面了。
登陆Nexus:
Nexus的权限控制很完善,默认的Nexus访问都是匿名的,而匿名用户仅包含一些最基本的权限,要获得更高的权限,就必须以管理员方式登录。单击界面右上角的Log In进行登陆,Nexus的默认管理员用户名和密码为admin/admin123。
Nexus的仓库与仓库组:
Nexus包含了各种类型的仓库概念,包括代理仓库、宿主仓库和仓库组等。每一种仓库都提供了丰富实用的配置参数,方便用户根据需要进行定制。
Nexus内置的仓库:
单击Nexus界面左边导航栏中的Repository链接,就能在界面右边看到当前nexus所包含的所有仓库。
从中可以看到仓库有四种类型:group(仓库组)、hosted(宿主)、proxy(代理)和virtual(虚拟)。此外仓库还有一个属性为Policy(策略),表示该仓库为发布(Release)版本仓库还是快照(Snapshot)版本仓库。最后两列的值为仓库的状态和路径。
下面解释一下各个仓库的用途:
- Maven Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
- Releases:这是一个策略为Releases的宿主类型仓库,用来部署组织内部的发布版本构件。
- Snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件。
- 3rd party:这是一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构件。
- Apache Snapshots:这个一个策略为Snapshots的代理仓库,用来代理Apache Maven仓库的快照版本构件。
- Codehaus SnapShots:这是一个策略为Snapshots的代理仓库,用来代理Cohehaus Maven仓库的快照版本构件。
- Google Code:这是一个策略为Release的代理仓库,用来代理Google Code Maven仓库的发布版本构件。
- java. net -Maven 2:这是一个策略为Release的代理仓库,用来代理java.net Maven仓库的发布版本构件。
- Public Repository:该仓库组将上诉所有策略为Release的仓库聚合并通过一致的地址提供服务。
- Public Snapshot Repositories:该仓库组将上述所有策略为Snapshot的仓库聚合并通过一致的地址提供服务。
Nexus仓库的分类的概念:
示意图如下:
从图中可以看到,Maven可以直接从宿主仓库下载构件;Maven也可以从代理仓库下载构件,而代理仓库会间接地从远程仓库下载并缓存构件;最后,为了方便,Maven可以从仓库组下载构件,而仓库组没有实际内容,它会转向其包含的宿主仓库或者代理仓库获得实际构件的内容。
Nexus的索引与构件搜索:
对于Nexus我们常用的功能是搜索一个构件。Nexus通过维护一个索引来提供搜索功能,能在很大程度上方便Maven用户定位构件坐标。
为了能够搜索Maven中央库,首先需要设置Nexus中Maven Central代理仓库下载远程索引。需要注意的是,默认这个配置的值是关闭的。
有了索引,用户就可以搜索Maven构件了。Nexus左边导航栏有一个快捷搜索框,输入关键字就可以进行搜索了。
在搜索的结果中单击某一项,会在界面的下端浮出一个更具体的构件信息面板。
该面板中除了显示构件的坐标,还包含了一段XML依赖声明,用户可以直接复制粘贴到项目的POM中。除了简单的关键字搜索,在Nexus中还提供了GAV搜索、类名搜索和检验和搜索等功能,用户可以单击搜索页面左上角的下拉菜单选择高级搜索功能:
- GAV搜索(GAV Search) :允许用户通过设置GroupId、ArtifactId和Version等信息来进行更有针对性的搜索。
- 类名搜索(Classname Search) :允许用户搜索包含某个Java类的构件。
- 校验和搜索(checksum Search):允许用户直接使用构件的检验和来搜索该构件
配置Maven从Nexus下载构件:
在POM中可以设置项目从私服中下载构件,但是实际应用中,我们通常想要所有项目都从私服中下载构件,这时就需要我们在setting.xml文件配置。setting.xml并不支持直接配置repositories和pluginRepositories,但是Maven能使用Profile机制,能让用户将仓库配置放到setting.xml的profile中。在实际应用中,我们希望的是所有下载请求都通过私服,所以我们还需要用到镜像的配置。
配置范例如下:
<settings> ... <mirrors> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/nexus/content/groups/public</url> </mirror> </mirrors> <profiles> <profile> <id>nexus</id> <repositories> <repository> <id>central</id> <url>http://central</url> <release><enabled>true</enabled></release> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <repository> <id>central</id> <url>http://central</url> <release><enabled>true</enabled></release> <snapshots><enabled>true</enabled></snapshots> </repository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles> ... </settings>
这里的仓库及插件仓库配置,它们的id都为central,也就是说,覆盖了超级POM中央仓库的配置,它们的url已无关紧要,因为所有请求都会通过镜像访问私服地址。配置仓库及插件仓库的主要目的是开启对快照版本下载的支持,当Maven需要下载发布版或快照版构件的时候,它首先检查central,看该类型的构件是否支持,得到正面的回答之后,再根据镜像匹配规则转而访问私服仓库地址。
部署构件至Nexus:
我们经常将组织内部的,或者一些无法从公共仓库中获得的第三方构件上传到宿主仓库中,供大家使用。用户可以配置Maven自动部署构件至Nexus的宿主仓库,也可以通过界面上传构件。
使用Maven部署构件至Nexus:
日常开发生成的快照版本构件可以直接部署到Nexus中策略为Snapshot的宿主仓库中,项目正式发布的构件则应该部署到Nexus中策略为Release的宿主仓库中。下面展示一段典型的配置:
<project> ... <distributionManagement> <repository> <id>nexus-release</id> <name>Nexus Release Repository</name> <url>http://localhost:8081/nexus/content/repositories/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>Nexus Snapshots Repository</name> <url>http://localhost:8081/nexus/content/repositories/snapshots/</url> <snapshotRepository> </distributionManagement> ... </project>
Nexus的仓库对于匿名用户是只读的。为了能够部署构件,需要在settings.xml中配置认证信息,如下:
<settings> ... <servers> <server> <id>nexus-release</id> <username>admin</username> <password>*****</password> </server> <id>nexus-snapshots</id> <username>admin</username> <password>*****</password> </servers> ... </settings>
手动部署:
有时,我们需要将手动部署构件到仓库中。
要上传第三方构件,首先选择一个宿主仓库,然后在页面的下方选择Artifact Upload选项卡。在上传构件的时候,Nexus要求用户确认其Maven坐标,如果该构件是通过Maven构建的,那么可以在GAV Definition下拉列表中选择From POM,否则选择GAV Parameters,用户需要为该构件定义一个Maven坐标。