背景:web
周五同事和我探讨一个话题,他在咱们搭建的nexus仓库中搜到的slf4j版本是3.1(打个比方),位于代理的Central Repository,可是他须要的版本是3.2(打个比方), 可是此nexus中没有slf4j的3.2版本,可是当他点击进Central Repository而且选择browse Remote Index时候,却看到有3.2版本(和其余版本)的构件,为何呢?json
缘由分析:浏览器
通过分析,我找到了缘由,原来搜索仓库和点击某仓库选择browse Remote Index走的是不同的机制。缓存
对于仓库搜索,其等效于仓库查询:服务器
其调用的请求是:http://localhost:8081/nexus/service/local/repositories?_dc=1416624550968 ,这个请求的响应入口在${bundleBaseDir}/nexus/WEB-INF/plugin-repository/nexus-restlet1x-plugin-2.10.0-02目录下的nexus-restlet1x-plugin-2.10.0-02.jar包中的RepositoryListPlexusResource类的get()方法:网络
其中listRepositories()方法定义在父类AbstractRepositoryPlexusResource中,它用于构造响应json payload.构造完响应对象就是每一个被nexus代理的repository类的详细信息,为了突出重点,我这里只贴了一部分(好比代理的central repository的信息):maven
从这里看出,请求查看的配置URI是http://localhost:8081/nexus/service/local/repositories/central,它打开后是一个XML格式的仓库配置文件。而仓库中缓存的中央仓库的内容则能够经过contentResourceURI来访问。缓存的内容存储在nexus所在文件系统的effectiveLocalStorageUrl (即${bundleBasedir}/../sonatype-work /nexus/storage/{repositoryId}),缓存的内容所代理的真正远程仓库地址配置在remoteUri中。而咱们知道,只有maven应用配置了指向本地仓库,当使用某构件时候,nexus发现本身没有,这才会从中央仓库下载指定的构件而且存储在storage子目录下。不然,它是绝对不会主动从远程仓库吧这些构件都下载到本地的(这个很容易想,由于代理的仓库都很是巨大,涉及构件多个版本,你总不能把本身搭的服务器去和真正远程仓库去比把,存储的数量级也不同)。ide
实验也证明了咱们这一点,好比刚安装的这个干净的nexus, 这个${bundleBasedir}/../sonatype-work /nexus/storage/{repositoryId})里面是没有具体的构件的,只有一个archetype-catalog.xml:工具
干净的nexus local 存储截图以下(以代理的repositoryId=central 为例):spa
这个archetype-catalog.xml只用于标示此仓库中构件的目录。
因此,咱们相信,若是在nexus仓库中搜到了slf4j版本是3.1的构件,那么确定咱们有某个项目的<dependency>或者间接<dependency>中用到了这个构件,所以同事在构件仓库搜索中是搜到了这个构件的。可是由于历来没任何的项目用到slf4j版本是3.2的构件,因此构件仓库搜索中搜不到。
关于某仓库的“Browse Remote ”:
从web 客户端工具能够看出,它实际请求的URL是:
这个请求会被位于${bundleBaseDir}\nexus\WEB-INF\plugin-repository\nexus-rrb-plugin-2.10.0-02目录下的nexus-rrb-plugin-2.10.0-02中的RemoteBrowserResource类的get()方法所响应。
在get方法中,它会先获取repositoryId(好比咱们例子中的id=central),接着调用getResourceStoreRequest(request)方法来获取remote的列表,它其中会调用getValidRemoteIPAddress(request))方法来获取真正要访问的远程IP地址,好比咱们的central就是访问前面屡次提到的repo1.maven.org。 因此这一步必须要联网,不然没法解析出repo1.maven.org. 好比我作了个实验,我故意吧网络断开,则当点击”Browse Remote”并刷新时,就没法显示结果:
因此咱们相信,当咱们点击central repository而且查看“browse remote"时候,在联网的状况下,他总能找到这个构件(好比例子中版本是3.2的 slf4j),由于你搜索的是中央仓库。
总结:
(1)对于在仓库浏览器中浏览或者搜索构件,其搜索的是存在nexus服务器本地${bundleBasedir}/../sonatype-work /nexus/storage目录下的构件,若是找不到就找不到了。这些构件当maven应用配置指向nexus地址,而且nexus在本身层面找不到构件,才从相应的所代理的远程仓库中下载构件,而且存入storage目录。
(2)对于点击某仓库,查看其"browse remote",则只要网络通,就总能看到某版本构件,由于你直接查看了远程仓库的构件索引。