我读到“存储库简介”
Maven 中的存储库用于保存构建工件和不同类型的依赖项。
通过浏览远程 Maven 存储库,我发现工件显然是满足某些约束的目录,例如它必须包含一个名为 的文件maven-metadata.xml和一个名为 的文件<artifactId>-<version>.pom。这两个文件都有一些架构和语义。我还看到我在 处有一个“本地存储库” ~/.m2/repository。但目录结构不同,例如没有maven-metadata.xml文件。因此,远程存储库和我的本地存储库以不同的方式编码相同的数据。
但我显然是在猜测,无论是文档还是任何其他答案都无法澄清我的问题。那么——从正式的角度来说,什么是Maven 存储库?它在远程存储库和本地存储库中是如何编码的?
这是对答案的猜测:
存储库是从GAV到构建工件的映射。GAV 是一个三元组(groupId、artifactId、version),其中每个组件都是一个字符串。构建工件是从文件名到文件内容的映射。
存储库支持两种操作:
getBuildArtifact,如果存储库映射了给定的GAV ,则它接受GAV 并返回关联的构建工件;并且,它将提供的GAV映射到提供的构建工件。putBuildArtifact[...]
贾梅什费舍尔,
首先,您需要注意区分本地存储库和远程存储库。
其次,您过于深入地研究某些 Maven 存储库的实现,而没有首先对其建立高层次的概念性理解。
让我们从远程存储库开始。基本上,Maven 存储库用于构建工件(jar、wars、zip、poms 等),就像 Subversion 存储库对源代码所做的那样:集中存储源代码,以便开发人员可以以确保一致性的方式有效地共享其工作输出,稳定性和透明的版本管理。
大多数工件可以通过 3 个 GAV 坐标来识别,例如org.myproject + mylib + 1.0.
但有时单个构建不仅会生成mylib.jar,而且会同时生成 和mylib-sources.jar。mylib.zip然后,您将需要传递这些附加限定符来定位这些工件。
鉴于至少有 2 个主要实现 - Artifactory 和 Nexus,存储库如何在后台存储它是无关紧要的。重要的是 API,而不是实现,只要您指定 pom.xml 文件的依赖项部分,以便您可以识别所需的工件,我不明白为什么您需要了解底层实现。
现在让我们看看本地存储库。是的,这些要简单得多 - 基本上是一个本地镜像 GAV 约定的文件夹系统,用于在本地计算机上存储 jar。简而言之,本地存储库用于缓存工件,因此您的构建速度更快。如果您必须为每个构建的每个依赖项访问 Maven 中心,那么您的构建将花费很长时间,并且它们的服务器可能会不堪重负。
相反,您的本地存储库会从 Maven 中心下载一次依赖项,并且不会再次检查(不太正确:SNAPSHOT 依赖项将每天重新检查一次,或者如果您传递“-U”标志,这会增加大量的网络活动这就是为什么您应该尽可能选择发布依赖项而不是快照)。
无论如何,要点是本地存储库只是在该盒子上构建的缓存机制。远程存储库是指您准备与其他人共享工件,然后其他人会将其下载到本地存储库以进行构建。
希望能澄清事情。
| 归档时间: |
|
| 查看次数: |
1034 次 |
| 最近记录: |