Nexus开源版本的一些特性
较小的内存占用,最小仅为28MB
基于ExtJS的友好界面
基于Restlet的完全REST API
支持代理仓库、宿主仓库和仓库组
基于文件系统,不需要数据库
支持仓库索引和搜索
支持从界面上传Maven构件
细粒度的安全控制
Bundle方式安装Nexus
Nexus的Bundle自带了Jetty容器。将Bundle文件解压后会得到两个子目录:nexus-webapp-1.7.2(该目录包含了Nexus运行所需要的文件,如启动脚本、依赖jar包等)和sonatype-work(该目录包含了Nexus生成的配置文件、日志文件、仓库文件等)。
nexus-webapp-1.7.2(version)是Nexus所必需的,而且所有相同版本Nexus实例包含的该项目内容是一样的。第二个目录不是必须的,Nexus会在运行时动态创建该目录。Nexus在不同用户的不用机器上会有不同的配置和仓库内容。当用户需要备份Nexus的时候,默认备份sonatype-work/目录,因为该目录包含了用户特定的内容。
用户只需要进入nexus-webapp-1.7.2/bin/jsw/windows-x86-32/子目录,然后直接运行nexus.bat即可启动Nexus。Nexus的访问地址为localhost:8081/nexus/
若发生端口冲突,则编辑nexus-webapp-1.7.2/conf/plexus.properties,找到属性application-port,按需要将默认值8081改成其他端口号即可
nexus-webapp-1.7.2/bin/jsw/windows-x86-32/下还有一些脚本
Installnexus.bat //将Nexus安装成Windows服务
Unistallnexus.bat //卸载Nexus Windows服务
Startnexus.bat //启动Nexus Windows服务
Stopnexus.bat //停止Nexus Windows服务
Pausenexus.bat //暂停Nexus Windows服务
Resumenexus.bat //恢复暂停的Nexus Windows服务
War方式安装Nexus
将war包直接部署到Web容器中即可。启动容器后登陆localhost:8080/nexus
Nexus默认的管理员用户名和密码为admin/admin123
Nexus中Repository中有四种类型:groupId(仓库组),hosted(宿主),proxy(代理)和virtual(虚拟)。每个仓库的格式为maven2或maven1。此外仓库还有一个属性为policy(策略),表示该仓库为发布版本(release)还是快照(snapshot)仓库版本。
Maven Central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件
Releases:这是一个策略为Release的宿主类型仓库,用来部署组织内部的发布版本构件
Snapshots:这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件
3rd parth:这是一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构件
Apache Snapshots:这是一个策略为Snapshot的代理仓库,用来代理Apache Maven仓库的快照版本构件
Codehaus Snapshots:这是一个策略为Snapshot的代理仓库,用来代理Codehaus Maven仓库的快照版本构件
Google Code:这是一个策略为Release的代理仓库,用来代理Google Code Maven仓库的发布版本构件
java.net - Maven 2:这是一个策略为Release的代理仓库,用来代理java.net Maven仓库的发布版本构件
Public Repository:该仓库组将上述所有策略为Release的仓库聚合并通过一致的地址提供服务
Public Snapshot Repositories: 该仓库组将上述所有策略为Snapshot的仓库聚合饼通过一致的地址提供服务
Maven可以直接从宿主仓库和代理仓库下载构件。代理仓库会间接地从远程仓库下载并缓存构件。Maven也可以从仓库组下载构件,仓库组并没有实际内容,它会转向其包含的宿主仓库或代理仓库获得实际构件的内容
创建宿主仓库
Default Local Storage Location表示该仓库的默认存储目录,该字段为空,待仓库创建好后,该值就会成为基于sonatype-work的一个文件路径,如项目路径/sonatype-work/nexus/storage/repository-id/,Override Local Storage Location可以用来配置自定义的仓库目录位置。在Access Settings小组中,Deployment Policy用来配置该仓库的部署策略,选项有只读(禁止部署)、关闭重新部署(同一构件只能部署一次)以及允许重新部署。Allow File Browsing表示是否允许浏览仓库内容。每个仓库都有一个Browse Storage选项卡,用户以树形结构浏览仓库存储文件的内容。Include in Search表示是否对该仓库进行索引并提供搜索。Publish URL用来控制是否通过URL提供服务,如选用flase,当访问该仓库的地址时,会得到HTTP 404 Not Found错误。配置中最后的Not Found Cache TTL表示当一个文件没有找到后,缓存之一不存在的信息的时间。以默认值1440分钟为例,如果某文件不存在,那么在之后的1440分钟内,如果Nexus再次得到该文件的请求,它将直接返回不存在信息,而不会查找文件系统。
创建代理仓库最重要的事远程仓库地址,即Remote Storage Location,用户必须在这里输入有效值。Download Remote Indexes表示是否下载远程仓库的索引。当某些远程仓库有索引,下载其索引后,即使没有缓存远程仓库的构件,用户还是能够在本地搜索和浏览那些构件的基本信息。Checksum Policy配置校验和出错时的策略,用户可以选择忽略、记录警告信息或拒绝下载。当远程仓库需要认证的时候,可以在Authentication配置。Expiration Settings较宿主仓库多了Artifact Max Age和Metadata Max Age。前者表示构件缓存的最长时间,后者表示仓库元数据文件缓存的最长时间。对于发布版本仓库来说,Artifact Max Age默认值为-1,表示构件缓存后就一直保存着,不再重新下载。对于快照版仓库来说,Artifact Max Age默认值为1440分钟,表示每隔一天重新缓存代理的构件。HTTP Request Settings用来配置Nexus访问远程仓库时HTTP请求的参数,Override HTTP Proxy Settings用来配置HTTP代理。
创建Nexus仓库组
用户可以直观的选择Nexus中的仓库,将其聚合成一个虚拟的仓库组。仓库组所包含的仓库的顺序决定了仓库组遍历其所含仓库的次序,因此将常用的仓库放在前面。
Nexus提供了GAV搜索、类名搜索和校验和搜索等功能,用户可以单击搜索页面左上角的下拉菜单选择高级搜索功能。
GAV搜索:允许用户通过设置GroupId、ArtifactId和Version等信息来进行更有针对性的搜索
类名搜索:允许用户搜索包含某个Java类的构件
检验和搜索:允许用户直接使用构件的校验来搜索该构件
Nexus能够遍历一个Maven仓库所有的内容,搜集他们的坐标、校验和及所含的Java类信息,然后以nexus-indexer的形式保存起来。中央仓库维护了这样一个nexus-indexer,因此本地的nexus下载到这个索引后,就能在此基础上提供搜索和浏览等服务。不是任何一个公共仓库都提供nexus-indexer,对于那些不提供索引的仓库来说,我们就无法对其进行搜索。
在pom中配置Nexus
<project> <repositories> <repository> <id>nexus</id> <name>Nexus</name> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepository> <pluginRepository> <id>nexus</id> <name>Nexus</name> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepository> </project>
在settings中配置Nexus
<settings> <profiles> <profile> <id>nexus</id> <repositories> <repository> <id>nexus</id> <name>Nexus</name> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases> <enables>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>nexus</id> <name>Nexus</name> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </plugiinRepositories> </profile> </profiles> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles> </settings>
配置镜像让Maven只是用私服
这里的仓库及插件仓库配置id都为central,覆盖了超级POM中央仓库的配置,他们的url已无关紧要,因为所有请求都会通过镜像访问私服地址。配置仓库及插件仓库的主要目的是开启对快照版本下载的支持,当Maven需要下载发布版本或快照构件的时候,它首先检查central,看该类型的构件是否支持,之后再根据镜像匹配规则转而访问私服仓库地址。
<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> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://central</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles> </settings>
配置Maven部署构件至Nexus
<project> <distributionManagement> <repository> <id>nexus-releases</id> <name>Nexus Releases Repository</name> <url>http://localhost:8081/nexus/content/repositories/releases/</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-releases</id> <username>admin</username> <password>password</password> </server> <server> <id>nexus-snapshots</id> <username>admin</username> <password>password</password> </server> </servsers> </settings>
Nexus是基于权限做访问控制的,服务器的每一个资源都有相应的权限来控制。因为用户执行特性的操作时就必须拥有必要的权限。管理员必须以角色Role的方式将权限赋予Nexus用户。
Nexus预定义了三个用户
admin:该用户拥有对Nexus服务的完全控制
deployment:该用户能够访问Nexus,浏览仓库内容,搜索并上传部署构件,但无法对Nexus进行任何配置
anonymous:该用户对应了所有未登录的匿名用户,他们可以浏览仓库并进行搜索
Nexus预定义了一些常用且重要的角色
UI:Basic UI Privileges:包含了访问Nexus界面必须的最基本的权限
UI:Repository Browser:包含了浏览仓库页面所需要的权限
UI:Search:包含了访问快速搜索栏及搜索页面所需要的权限
Repo:All Repositories(Read):给予用户读取所有仓库内容的权限,没有仓库的读权限,用户将无法在仓库页面上看到实际的仓库内容,也无法使用Maven从仓库下载构件
Repo:All Repositories(Full Control):给予用户完全控制所有仓库内容的权限。用户不仅可以浏览、下载构件,还可以部署构件及删除仓库内容
我们应该为每个项目分配独立的仓库,并且只将仓库的部署、修改和删除权限赋予该项目的成员,其他用户只能读取、下载和搜索该仓库的内容。在Nexus,增删改查权限是基于Repository Target建立的,Repository Target实际上是一系列的正则表达式,在访问仓库某路径下内容的时候,Nexus会将仓库路径与Repository Target的正则表达式一一匹配,以检查权限是否正确。
Nexus提供了一系列可配置的调度任务来方便用户管理系统。用户可以设定这些任务的运行方式。调度任务会在适当的时候在后台运行。单击Scheduled Tasks链接建立一个任务。
Nexus包含了一下几种类型的调度任务:
Download Indexes:为代理仓库下载远程索引
Empty Trash:清空Nexus的回收站
Evict Unused Proxied Items From Repository Caches:删除代理仓库中长期未被使用的构建缓存
Expire Repository Caches:Nexus为代理仓库维护了远程仓库的信息以避免不必要的网路流量,该任务清空这些信息以强制Nexus去重新获取远程仓库的信息
Publish Indexes:将仓库索引发布成可供m2eclipse和其他Nexus使用的格式
Purge Nexus Timeline:删除Nexus的时间线文件,该文件用于简历系统的RSS源
Rebuild Maven Metadata Files:基于仓库内容重新创建仓库元数据文件maven-metadata.xml,同时重新创建每个文件的校验和md5和sha1
Reindex Repositories:为仓库编纂索引
Remove Snapshots From Repository:以可配置的方式删除仓库的快照构件
Synchronize Shadow Repository:同步虚拟仓库的内容(服务于Maven1)