什么是Maven存储库?

时间:2014-10-29 11:37:46

标签: maven repository

我在"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 映射到提供的构建工件

     

[...]

1 个答案:

答案 0 :(得分:3)

jameshfisher,

首先,您需要注意区分本地存储库和远程存储库。

其次,如果没有首先建立对它的高级概念性理解,你就会深入研究某些Maven资源库的实现。

让我们从远程存储库开始。基本上,Maven repo可以构建Subversion repo对源代码所做的工件(jar,war,zip,poms等):集中存储它,以便开发人员能够以确保一致性的方式有效地共享工作的输出,稳定性和透明版本管理。

大多数工件可以通过3个GAV坐标识别,例如org.myproject + mylib + 1.0

但有时,单个构建不仅会同时生成mylib.jar,还会生成mylib-sources.jarmylib.zip。然后,您需要传递这些额外的限定符来定位这些工件。

如果存在至少2个主要的实现 - Artifactory和Nexus,那么存储库如何存储它是无关紧要的。它是API,而不是重要的实现,只要您指定pom.xml文件的依赖项部分,以便您可以识别所需的工件,我不明白为什么您需要知道底层实现。

现在让我们看一下本地存储库。是的,这些更简单 - 基本上是一个文件夹系统,它本地镜像GAV约定,用于在本地计算机上存储jar。简而言之,本地存储库用于缓存工件,因此您的构建更快。如果你必须访问Maven central来获取每个构建的每个依赖项,你的构建将需要永远,并且它们的服务器可能会不堪重负。

相反,您的本地存储库会从Maven中心下载一次依赖项,并且不会再次检查(不完全正确:SNAPSHOT依赖项将每天重新检查一次,或者如果您传递“-U”标志,则会添加相当大的网络活动,这就是为什么你应该在可能的情况下更喜欢快照的版本依赖性。

无论如何,主要的一点是本地存储库只是该框上构建的缓存机制。远程回购是指您准备与其他人共享工件,然后他们会将其下载到他们的本地存储库中进行构建。

希望澄清事情。