既然Nexus能够维护宿主仓库并代理缓存远程仓库(如Maven中央库),那么一个简单的需求就自然浮现出来了,这就是搜索。Maven中央库有几十万构件供用户使用,但有时我们往往仅仅知道某个关键字,如Ehcache,而不知道其确切的Maven坐标。Nexus通过维护仓库的索引来提供搜索功能,能在很大程度上方便Maven用户定位构件坐标。
6.8.1节介绍了Sonatype提供的在线免费搜索服务,其实用户可以很方便地自己维护一个Nexus实例,并提供搜索服务。
为了能够搜索Maven中央库,首先需要设置Nexus中的Maven Central代理仓库下载远程索引,如图9-9所示。需要注意的是,默认这个配置的值是关闭的。此外,由于中央库的内容比较多,因此其索引文件比较大,Nexus下载该文件也需要比较长的时间,读者还需要耐心等待。
可以想象到,Nexus在后台运行了一个任务来下载中央仓库的索引,幸运的是,用户可以通过界面直接观察这一任务的状态。单击界面左边导航栏中的Scheduled Tasks链接后,用户就能在界面的右边看到系统的调度任务,如果Nexus正在下载中央仓库的索引,用户就能看到图9-10所示的一个任务,其状态为RUNNING。在索引下载完毕之后,该任务就会消失。
有了索引,用户即可搜索Maven构件了。Nexus界面左边导航栏有一个快捷搜索框,在其中输入关键字后,单击搜索按钮就能快速得到搜索结果,如图9-11所示。
图9-9 为Maven Central仓库开启远程索引下载
图9-10 下载Maven中央仓库索引的后台任务
图9-11 在Nexus中快速搜索构件
该例使用了ehcache关键字进行搜索,因此得到了大量与ehcache相关的结果,结果中的每一行都表示了一类构件,信息包括GroupId、ArtifactId、最新版本以及最新版本的相关文件下载等。单击其中的某一行,界面的下端会浮出一个更具体的构件信息面板,如图9-12所示。
图9-12 Nexus的构件信息面板
该面板除了显示构件的坐标,还包含了一段XML依赖声明,用户可以直接复制粘贴到项目的POM中。此外,用户还能从该面板获知构件在仓库中的相对位置。单击Artifact Information还能看到文件具体的大小、更新时间、SHA1和MD5校验和以及下载链接。除了简单的关键字搜索,Nexus还提供了GAV搜索、类名搜索和校验和搜索等功能,用户可以单击搜索页面左上角的下拉菜单选择高级搜索功能:
·GAV搜索(GAV Search)允许用户通过设置GroupId、ArtifactId和Version等信息来进行更有针对性的搜索。
·类名搜索(Classname Search)允许用户搜索包含某个Java类的构件。
·校验和搜索(Checksum Search)允许用户直接使用构件的校验和来搜索该构件。
图9-11所示的结果中包含了各种坐标的结果。基于该结果的信息,笔者进一步确定了自己需要的构件的GroupId和ArtifactId,它们分别为net.sf.ehcache和ehcache。这时就可以单击对应的Show All Versions转到GAV搜索功能来缩小搜索范围,如图9-13所示。
图9-13 在Nexus中使用GAV搜索构件
当然,用户也可以自己手动输入GroupId、ArtifactId等信息来进行GAV搜索。
有了中央仓库的索引,用户不仅能够搜索构件,还能够直接浏览中央仓库的内容。这便是Nexus的索引浏览功能。在Repositories页面中,选择Browse Index选项卡,就能看到中央仓库内容的树形结构,如图9-14所示。
图9-14 Nexus的索引浏览
以上的搜索及浏览功能都是基于Nexus索引而实现的,确切地应该称之为nexus-indexer。Nexus能够遍历一个Maven仓库所有的内容,搜集它们的坐标、校验和及所含的Java类信息,然后以nexus-indexer的形式保存起来。中央仓库维护了这样的一个nexus-indexer,因此本地的Nexus下载到这个索引之后,就能在此基础上提供搜索和浏览等服务。需要注意的是,不是任何一个公共仓库都提供nexus-indexer,对于那些不提供索引的仓库来说,我们就无法对其进行搜索。
除了下载使用远程仓库的索引,我们也能为宿主仓库和代理仓库建立索引。只需要在仓库上右击,从弹出的快捷菜单中选择ReIndex即可,如图9-15所示。待索引编纂任务完成之后,就能搜索该仓库所包含的构件。
图9-15 为Nexus仓库编纂索引
对于宿主仓库来说,ReIndex任务会扫描该仓库包含的所有构件建立索引。对于代理仓库来说,ReIndex任务会扫描所有缓存的构件建立索引,如果远程仓库也有索引,则下载后与本地的索引合并。对于仓库组来说,ReIndex任务会合并其包含的所有仓库的索引。