我在"Introduction to Repositories"上看到
Maven中的存储库用于保存不同类型的构建工件和依赖项。
通过browsing a remote Maven repository我看到一个工件显然是一个满足某些约束的目录,例如:它必须包含名为maven-metadata.xml
的文件和名为<artifactId>-<version>.pom
的文件。这两个文件都有一些模式和语义。我还看到我在~/.m2/repository
有一个“本地存储库”。但是目录结构是不同的,例如没有maven-metadata.xml
个文件。因此,远程存储库和我的本地存储库以不同的方式编码相同的数据。
但我显然在猜测,无论是文档,还是SO上的任何其他答案,都无法解决我的问题。那么 - 正式来说, 是一个Maven存储库?这是如何在远程存储库和本地存储库中编码的?
这是对答案的猜测:
存储库是从 GAV 到构建工件的映射。 GAV是三个(groupId,artifactId,version),其中每个组件都是一个字符串。 构建工件是从文件名到文件内容的映射。
存储库支持两个操作:
getBuildArtifact
,它接受 GAV 并返回相关的构建工件,如果给定的 GAV 由存储库映射;和putBuildArtifact
,它将提供的 GAV 映射到提供的构建工件。[...]
答案 0 :(得分:3)
jameshfisher,
首先,您需要注意区分本地存储库和远程存储库。
其次,如果没有首先建立对它的高级概念性理解,你就会深入研究某些Maven资源库的实现。
让我们从远程存储库开始。基本上,Maven repo可以构建Subversion repo对源代码所做的工件(jar,war,zip,poms等):集中存储它,以便开发人员能够以确保一致性的方式有效地共享工作的输出,稳定性和透明版本管理。
大多数工件可以通过3个GAV坐标识别,例如org.myproject + mylib + 1.0
。
但有时,单个构建不仅会同时生成mylib.jar
,还会生成mylib-sources.jar
和mylib.zip
。然后,您需要传递这些额外的限定符来定位这些工件。
如果存在至少2个主要的实现 - Artifactory和Nexus,那么存储库如何存储它是无关紧要的。它是API,而不是重要的实现,只要您指定pom.xml文件的依赖项部分,以便您可以识别所需的工件,我不明白为什么您需要知道底层实现。
现在让我们看一下本地存储库。是的,这些更简单 - 基本上是一个文件夹系统,它本地镜像GAV约定,用于在本地计算机上存储jar。简而言之,本地存储库用于缓存工件,因此您的构建更快。如果你必须访问Maven central来获取每个构建的每个依赖项,你的构建将需要永远,并且它们的服务器可能会不堪重负。
相反,您的本地存储库会从Maven中心下载一次依赖项,并且不会再次检查(不完全正确:SNAPSHOT依赖项将每天重新检查一次,或者如果您传递“-U”标志,则会添加相当大的网络活动,这就是为什么你应该在可能的情况下更喜欢快照的版本依赖性。
无论如何,主要的一点是本地存储库只是该框上构建的缓存机制。远程回购是指您准备与其他人共享工件,然后他们会将其下载到他们的本地存储库中进行构建。
希望澄清事情。