什么是Maven存储库?

什么是Maven存储库?,maven,repository,Maven,Repository,我读到了 Maven中的存储库用于保存不同类型的构建工件和依赖项 我看到工件显然是一个满足某些约束的目录,例如,它必须包含一个名为maven-metadata.xml的文件和一个名为-.pom的文件。这两个文件都有一些模式和语义。我还看到我在~/.m2/repository有一个本地存储库。但是目录结构不同,例如,没有maven-metadata.xml文件。因此,远程存储库和本地存储库以不同的方式编码相同的数据 但我显然是在猜测,无论是文档还是其他答案,都没有澄清我的问题。那么,从形式上讲,什

我读到了

Maven中的存储库用于保存不同类型的构建工件和依赖项

我看到工件显然是一个满足某些约束的目录,例如,它必须包含一个名为maven-metadata.xml的文件和一个名为-.pom的文件。这两个文件都有一些模式和语义。我还看到我在~/.m2/repository有一个本地存储库。但是目录结构不同,例如,没有maven-metadata.xml文件。因此,远程存储库和本地存储库以不同的方式编码相同的数据

但我显然是在猜测,无论是文档还是其他答案,都没有澄清我的问题。那么,从形式上讲,什么是Maven存储库?这在远程存储库和本地存储库中是如何编码的

下面是对答案的猜测:

存储库是GAV构建工件的映射。GAV是一个三重groupId、artifactId版本,其中每个组件都是一个字符串。构建工件是从文件名到文件内容的映射

存储库支持两个操作:getBuildArtifact,如果存储库映射了给定的GAV,则获取GAV并返回关联的构建工件;和putBuildArtifact,它将提供的GAV映射到提供的构建工件

[……]

杰米舍尔

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

第二,在没有首先建立对特定Maven存储库的高级概念性理解的情况下,您太深入地研究了它的实现

让我们从远程存储库开始。基本上,Maven repo用于构建工件JAR、WAR、ZIP、POM等,就像Subversion repo用于源代码一样:集中存储这些工件,以便开发人员能够以确保一致性、稳定性和透明版本管理的方式高效地共享他们的工作输出

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

但有时一个构建不仅会生成mylib.jar,还会同时生成mylib-sources.jar和mylib.zip。然后需要传入这些附加限定符来定位这些工件

存储库如何将其存储在引擎盖下是无关紧要的,因为至少有两个主要的实现——Artifactory和Nexus。重要的是API,而不是实现,只要指定pom.xml文件的依赖项部分以便识别所需的工件,我就不明白为什么需要了解底层实现

现在让我们看看本地存储库。是的,这些要简单得多——基本上是一个文件夹系统,它在本地镜像了在本地机器上存储JAR的GAV约定。简单地说,本地repo用于缓存工件,因此构建速度更快。如果您必须为每个构建的每个依赖项访问Maven central,那么您的构建将花费很长时间,并且它们的服务器可能会不知所措

相反,您的本地repo只需从Maven central下载一次依赖项,而不必再次检查。不完全正确:快照依赖项将每天重新检查一次,或者如果您通过了-U标志,这将增加大量的网络活动,这就是为什么在可能的情况下,您更喜欢释放依赖项而不是快照

不管怎么说,主要的一点是,本地repos只是该框上构建的缓存机制。远程repos是指当您准备好与其他人共享工件时,他们将把工件下载到本地repos中进行构建


希望这能澄清问题。

如果你自己已经回答了问题,为什么还要期待答案呢。我不知道你希望得到什么,目的是什么?我自己还没有回答这个问题。这是一个猜测,需要更正和扩展。谢谢你的回答。关于API和实现:这是一个很好的区别。通过浏览文件系统,我试图对隐式API进行反向工程,因为正式API似乎不存在。我对以上答案的猜测是对API描述的一种尝试。数据模型将通过诸如get:GAV->Artifact和put:GAV,Artifact->void这样的操作进行扩展。后来我发现了声称定义API的Aether,但它非常庞大,而且显然不是特定于Maven的。pom.xml文件的依赖项部分实际上是正式的API。以上回答了你的问题吗?