私服是一种衍生出来的特殊的Maven仓库,通过建立私服,就可以降低中央仓库负荷,节省外网宽带,加速Maven构建,自己部署构建等,从而高效的使用Maven

有三种专门的Maven仓库管理软件可以用来帮助大家建立私服,Apache基金会的Archiva,JFrog的Artifactory和Sonatype的Nexus。

Nexus简介:支持代理仓库,宿主仓库,仓库组,基于文件系统,不需要数据库,支持仓库索引和搜索,支持上传Maven构件,安全控制

Nexus文档 :http://www.sonatype.com/products/nexus/community

下载Nexus地址: http://nexus.sonatype.org/downloads,nexus-1.7.2.war包,将war包复制到Tomcat的部署目录webapps目录下,接着运行start.bat启动tomcat

接着访问http://localhost:8080/nexus,默认是匿名进行登入的操作,要学习或管理就要使用管理员方式登录,点击右上角的Log In,输入admin/admin123就可以了

Nexus包含了各种类型的仓库概念,包括代理仓库,宿主仓库,仓库组等。点击页面Nexus界面左边导航栏中的Repositories链接,就能看到界面右边的所有类型的Nexus仓库,

仓库有四种类型:group(仓库组),hosted(宿主),proxy(代理),virtual(虚拟),每个仓库的格式为maven2或者maven1,此外仓库还有一个属性为Policy(策略),表示该仓库为发布

(Release)版本仓库还是快照(Snapshot)版本仓库,最后两列的值为仓库的状态和路径。

Maven Central,该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。

Releases,这是一个策略为Releases的宿主类型仓库,用来部署组织内部的发布版本构件。

Snapshots,这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件。

3rd party,这是一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构件。

Apache Snapshots,这是一个策略为Snapshot的代理仓库,用来代理Apache Maven仓库的快照版本构件。

Codehaus Snapshots,这是一个策略为Snapshot的代理仓库,用来代理Codehaus Maven仓库的快照版本构件。

Google Code,这是一个策略为Releases的代理仓库,用来代理Google Code Maven 仓库的发布版本构件。

java.net -Maven2,这是一个策略为Release的代理仓库,用来代理java.net.Maven仓库的发布版本构件。

Public Repositories,该仓库组将上述所有策略为Release的仓库聚合并通过一致的地址提供服务。

PublicSnapshot Repositories,该仓库将上述所有策略为Snapshot的仓库聚合并通过一致的地址提供服务。

例子:某公司建立一个Maven项目X,公司内部建立了Nexus私服,为所有Maven项目提供服务,项目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的时候,他直接从Public Repositories下载,Public Repositories会选择Maven Central提供实际的内容。

Nexus仓库分类的概念:

Maven可以直接从宿主仓库下载构建;Maven也可以从代理仓库下载构建,而代理仓库会间接的从远程仓库下载并缓存构建,最后,为了方便,Maven可以从仓库组下载构建,

而仓库组没有实际内容,他会转向其包含的宿主仓库或者代理仓库获得实际构件的内容。

创建Nexus宿主仓库:单击左边导航栏的Repositories链接,在右边面板中,选择Add,接着在下拉菜单中选择Hosted Repository。

根据自己的需要填入仓库的ID和名称,下一字段Repository Type表示该仓库的类型,Provider用来确定该仓库的格式,一般来说,选择默认的Maven2 Repository,然后是

Repository Policy,读者可以根据自己的需要来配置该仓库是发布版构建仓库还是快照版构建仓库,Default Local Storage Location表示该仓库的默认存储目录,如果这个字段

为空的话,待仓库创建之后,该值就会成为基于sonatype-work的一个文件路径,如sonatype-work/nexus/storage/repository-id,Override Local Storage Location可以用来配置

自定义的仓库目录位置。

在Access Settings小组中,Deployment Policy用来配置该仓库的部署策略,选项有只读(禁止部署),关闭重新部署(同一构件只能部署一次)以及允许重新部署,Allow FIle 

Browsing表示是否允许浏览仓库内容,一般选True,每个仓库(包括代理仓库和仓库组)都有一个Browse Storage选项卡,用户以树形结构浏览仓库存储文件的内容,Include in 

Search表示是否对该仓库进行索引并提供搜索,Public Url用来控制是否通过URL提供服务,如果选false,那么访问该仓库的地址时,会得到404 Not Found 错误,配置中最后

的Not Found Cache TTL表示当一个文件没有找到后,缓存这一不存在信息的时间,以默认1440分钟为例,如果某文件不存在,那么在之后的1440分钟内,如果Nexus再次

得到该文件的请求,他将直接返回不存在信息,而不会查找文件系统,可以避免重复的文件查找操作以提升性能。

创建Nexus代理仓库:同样点击Add 接着选中Proxy Repository ,仓库的ID,名称,Provider,Format,Policy,默认本地存储位置和覆盖本地存储位置等配置上面已经提过,

需要注意的是,这里的Repository Type 的值为proxy。对于代理仓库来说,最重要的是远程仓库的地址,即 Remote Storage Location,用户必须在这里输入有效的值,

Download Remote indexes表示是否下载远程仓库的索引,有些远程仓库拥有索引,下载其索引后,即使没有缓存远程仓库的构建,用户还是能够在本地搜索和浏览那些构建

的基本信息,Checksum Policy配置校验和出错时的策略,用户可以选择忽略,记录警告信息或者拒绝下载,当远程仓库需要认证的时候,这里的Authentication配置就能派上

用处了。

Access Settings的配置与宿主仓库类似,Expiration Settings较宿主仓库多了Artifact Max Age和Metadata Max Age,其中,前者表示构建缓存的最长时间,后者表示仓库元数据

文件缓存的最长时间,对于发布版仓库来说,Artifact Max Age默认值为-1,表示构件缓存后就一直保存着,不在重新下载,对于快照版仓库来说,Artifact Max Age默认值为1440

分钟,表示每隔一天重新缓存代理的构件。配置中最后两项为HTTP Request Settings和Override HTTP Proxy Settings,前者用来配置Nexus访问远程仓库时HTTP请求的参数,

后者用来配置HTTP代理。

创建Nexus仓库组:

要创建一个仓库组,依然点击Add,选择Repository Group,配置中的ID,Name等信息和之前的差不多,仓库组没有Release和Snapshot的区别,这不同于宿主仓库和代理仓库

,在配置界面中,用户可以非常直观的选择Nexus中仓库,将其聚合成一个虚拟的仓库组,注意,仓库组所包含的仓库的顺序决定了仓库组遍历其所含仓库的次序,因此最好

将常用的仓库放在前面,当用户从仓库组下载构件的时候,就能够尽快的访问到包含构件的仓库。

Nexus的索引与构件搜索:Nexus通过维护仓库的索引来提供搜索功能,能在很大程度上方便Maven用户定位构件坐标,为了搜索Maven中央库,首先需要设置Nexus中的Maven

Central代理仓库下载远程索引,默认这个值是关闭的,中央仓库内容较多,索引文件就比较大,Nexus下载文件需要较长的时间。Nexus在后台运行了一个任务来下载中央仓库

的索引,用户可以单击左边导航栏中的Scheduled Tasks链接后,用户就可以在界面的右边看到系统的调度任务,如果Nexus正在下载中央仓库的索引,其状态为RUNNING,

在索引下载完毕后,该任务就会消失。有了索引,既可以搜索Maven构件了,Nexus界面左边导航栏有一个快捷搜索框,在其中输入关键字,单击搜索就能快速的搜索到结果。

结果中包含GroupId,ArtifactId,最新版本以及最新版本的相关文件下载,单击某一行,界面的下端会浮现一个更具体的构件信息面板。除了显示构件的坐标,还包含一段XML

依赖声明,可以直接复制黏贴到项目的POM中,此外,用户还能从该面板获知构件在仓库中的相对位置,单击Artifact Information还能看到文件具体的大小,更新时间,

SHA1和MD5校验和以及下载链接,除了简单的关键字搜索,Nexus还提供了GAV搜索,类名搜索和校验和搜索等功能,用户可以单击搜索页面左上角的下拉菜单选择高级搜索

功能:

GAV 允许用户通过设置GroupId,ArtifactId和Version等信息来进行更有针对性的搜索。

类名搜索 允许用户搜索包含某个Java类的构件

校验和搜索 允许用户直接使用构件的校验和来搜索该构件

有了中央仓库的索引,不仅能够搜索构件,还能够直接浏览中央仓库的内容,这便是Nexus的索引浏览功能,在Repositories页面中,选择Browse Index选项卡,就能看到中央

仓库内容的树形结构。

Nexus遍历一个Maven仓库所有的内容,搜集他们的坐标,校验及所含的Java类,然后以nexus-indexer的形式保存起来,中央仓库维护了这样的一个nexus-indexer,因此本地的

Nexus下载到这个索引之后,就能在此基础上提供搜索和浏览等服务,不过不是每个公共仓库都提供nexus-indexer,对于那些不提供索引的仓库来说,我们就无法对其进行搜索。

除了下载使用远程仓库的索引,我们也能为宿主仓库和代理仓库建立索引,只需要在仓库上右击,从弹出的快捷菜单中选择ReIndex即可,待索引编撰任务完成之后,就能搜索

该仓库所包含的构件。

对于宿主仓库来说,ReIndex任务会扫描该仓库包含的所有构件建立索引,对于代理仓库来说,ReIndex任务会扫描所有缓存的构件建立索引,如果远程仓库也有索引,则下载后

与本地的索引合并,对于仓库组来说,ReIndex任务会合并其包含的所有仓库的索引。

配置Maven从Nexus下载构件,仅在POM文件中配置只对当前Maven项目有效,在实际应用中,往往想要通过一次配置就能让本机所有的Maven项目都使用自己的Maven私服,

这个时候可能会想到settings.xml文件,该文件中的配置对所有本机Maven项目有效,但是setting.xml不支持配置repositories和pluginRepositories,还好Maven还提供了Profile

机制,能让用户将仓库配置到setting.xml中的Profile中。

<settings><profiles><profile><id>nexus<repositories><repository><id><name><url>http://localhost:8080/nexus/content/groups/public<releases><snapshots>

                                                                 <pluginRepositoies><pluginRepository><id><name><url>http://localhost:8080/nexus/content/groups/public/<releases><snapshots>

                 </profiles>

 <activeProfiles><activeProfile>nexus

上面的配置中使用了一个id为nexus的profile,这个profile包含了相关的仓库配置,同时配置中又使用activeProfile元素将nexus这个profile激活,这样当执行Mavan构建的时候,

激活的profile会将仓库配置应用到项目中去。

上面的配置已经能让本机所有的Maven项目从Nexus私服下载构件,不过注意到,Maven除了从Nexus下载构件之外,还会不时的访问中央仓库central,我们希望是所所有Maven

下载请求都仅仅通过Nexus,以全面发挥私服的作用,这个时候就要借助于Maven镜像配置了,可以创建一个匹配任何仓库的镜像,镜像的地址为私服,这样任何仓库的构件

下载请求都会转到私服中。

<settings><mirrors><mirror><id>nexus<mirrorOf>*<url>http://localhost:8080/nexus/content/groups/public

                 <profiles><profile><id><repositories><repository><id>central<url>http://central<releases><enabled>true<snapshots><enabled>true

                                                       <pluginRepositories><pluginRepository><id>central<url>http://central<releases><enabled>true<snapshots><enabled>true

关于镜像,profile及profile激活的配置,这里需要解释的是仓库及插件仓库配置,他们的id都是central,也就是说,覆盖了超级POM中央仓库的配置,他们的url已无关紧要,因为

所有请求都会通过镜像访问私服地址,配置仓库及插件仓库的主要目的是开启对快照版本下载的支持,当Maven需要下载发布版或快照版构件的时候,首先检查central,看该

类型的构件是否支持,得到回答之后,再根据镜像匹配规则转而访问私服仓库地址。

部署构件至Nexus:如果只为代理外部公共仓库,那么Nexus的代理仓库就已经能够完全满足需要了,对于另一类Nexus仓库--宿主仓库来说,他们的主要目的是储存组织内部的

或者一些无法从仓库中获得的第三方构件,供大家下载使用,用户可以配置Maven自动部署构件至Nexus的宿主仓库,通过界面手动上传构件。将开发生成的快照版构件可以直

接部署到Nexus中策略为Snapshot的宿主仓库中,项目正式发布的构件则应该部署到Nexus中策略为Release的宿主仓库中,POM的配置方式

<project><distributionManagement><repository><id>nexus-releases<name>Nexus Rleases Repository<url>http://localhost:8080/nexus/content/repositories/releases

                                                      <snapshotRepository><id>nexus-snapshots<name>Nexus Snapshots Repository<url>http://localhost:8080/nexus/content/repositories/snapshots

Nexus的仓库对于匿名用户是只读的,为了能够部署构件,还需要在settings.xml中配置认证信息:

<settings><servers><server><id>nexus-releases<username>admin<password>19841226<server><id>nexus-snapshots<username>admin<password>19841226

手动部署第三方构件至Nexus

例如Oracle的JDBC驱动无法公开的放在公共仓库中,他们没有把自己的构件分发到中央仓库中,也没有维护自己的仓库,因此无法从中央仓库获得,这个时候用户就需要将

这类构件手动下载到本地,然后通过Nexus的界面上传到私服中。要上传第三方构件,首先选择一个宿主仓库如3rd party,然后在页面的下方选择Artifact Upload选项卡,在

上传构件的时候,Nexus要求用户确定其Maven坐标,如果该构件是通过Maven构建的,那么可以在GAV Definition下拉列表中选择From POM,否则就选GAV Parameters

用户需要为该构件定义一个Maven坐标,例如上传一个Oracle 11g的JDBC驱动,定义好坐标之后,单击Select Artifact(s) to Upload按钮从本机选择要上传的构件,然后单击

Add Artifact按钮将其加入到上传列表中,Nexus允许用户一次上传一个主构件和多个附属构件(即Cleassifier),最后单击页面最下方的Upload Artifact(s)按钮将构件上传到仓库中

Nexus的权限管理

Nexus是基于权限(Privilege)做访问控制的,服务器每一个资源都有相应的权限来控制,因此用户执行特定的操作时就必须拥有必要的权限,管理员必须以角色(Role)的方式将

权限赋予Nexus用户,例如要访问Nexus界面,就必须拥有Status-(read)这个权限,而Nexus默认配置的角色UI:Basic UI Privileges就包含了这个权限,再将这个角色分配给

某个用户,这个用户就能访问Nexus界面了。用户可以被赋予一个或者多个角色,角色可以包含一个或者多个权限,角色还可以包含一个或者多个其他角色。

Nexus预定了三个用户,以admin登入后,单击页面左边导航栏中的User链接,就能看到所有已定义用户的列表,这三个用户对应了三个权限级别:

admin:该用户拥有对Nexus服务完全控制,默认密码是admin123

deployment:该用户能够访问Nexus,浏览仓库内容,搜索,并且上传部署构件,但是无法对Nexus进行任何配置,默认密码是deployment123

anonymous:该用户对应了所有未登录的匿名用户,他们可以浏览仓库进行搜索,

在User界面中,管理员可以添加用户,单击Add按钮,然后在用户配置面板中配置要添加用户的ID,名称,Email,状态,密码以及包含的角色,最后单击Save按钮即可

可以单击任何一个用户,选择下方的Role Tree,以树形结构详细的查看该用户所包含的角色以及进一步的权限

Nexus预定义的一些常用的角色包括:

UI:Basic UI Privileges 访问Nexus界面必须的最基本权限

UI:Repository Browser 包含了浏览仓库页面所需要的权限

UI:Search 包含了访问快速搜索栏及搜索页面所需要的权限

Repo:All Repositories(Read):给予用户读取所有仓库内容的权限,没有仓库的读权限,用户无法在仓库页面上看到实际的仓库内容,也无法使用Maven从仓库下载构件

Repo:All Repositories(Full Control):给予用户完全控制所有仓库内容的权限,用户不仅可以浏览,下载构件,还可以部署构件及删除仓库内容。

除上述角色之外,Nexus还预定义了很多其他角色,他们往往都对应了一个Nexus的功能,例如:UI:Logs and Config Files包含了访问系统日志文件及配置文件所需要的权限

为项目分配独立的仓库:

组织内部,如果所有项目都部署快照及发布版构件至同样的仓库,就会存在潜在的冲突及安全问题,我们不想让项目A的部署影响到项目B,解决方法就是为每个项目分配独立

的仓库,并且只将仓库的部署,修改和删除权限赋予该项目的成员,其他用户只能读取,下载和搜索该仓库的内容。假设项目名称为foo,建立两个宿主仓库Foo Snapshots和

Foo Releases,分别部署快照构件和发布构件,有了仓库之后,就需要基于仓库的增,删,改,查权限,在Nexus中,这样的权限是基于Repository Target建立的,Repository

Target实际上是一系列正则表达式,在访问仓库某路径下的内容的时候,Nexus会将仓库路径与Repository Target的正则表达式一一匹配,以检查权限是否正确。

单击左边导航栏中的Repository Targets链接,图中选中了All这一个Repository Target,在下方可以看到他包含了一个值为". *"的正则表达式,表示该Repository Target能够匹配

仓库下的任何路径。下一步就是基于该Repository Target和Foo Releases,Foo Snapshots两个仓库建立权限,单击页面左边导航栏的Privileges链接进入权限页面,然后单击

Add按钮,选择Repository Target Privilege,接着创建对应于Foo Releases的权限,选择了Foo Releases仓库和All(Maven2),表示创建匹配Foo Releases仓库任何路径的权限,单击

Save按钮之后,就能在权限列表中看到相应的增,删,改,查权限。然后遵循同样的步骤,为Foo Snapshots建立增,删,改,查权限,下一步是创建一个包含上述权限的

角色,单击导航栏中的Roles进入角色页面,再单击页面上方的Add按钮并选择Nexus Role,将之前建立的权限加入到该角色中,角色创建之后,根据需要将其分配给Foo项目

的团队成员,这样其他团队的成员默认只能读取Roo Relesase和Foo Snapshots的内容,而拥有Foo Deployer角色的用户就可以执行部署构件等操作了。

Nexus的调度任务:Nexus提供了可配置的调度任务来方便用户管理系统,可以设定这些任务运行的方式,例如每天,每周,调度任务会在适当的时候在后台运行,当然,用户

还是能够在界面观察他们的状态的,建立一个调度任务,单击左边导航栏的Scheduled Tasks连接,然后再右边的界面上方单击Add按钮,用户可以根据自己的需要,选择任务

类型,并配置其运行方式。

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和shal

Reindex Repositories 为仓库编写索引

Remove Snapshots From Repository 





















Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐