Maven仓库协议是什么?

20

最近我一直在学习Maven,并深受启发。我想知道如何像Maven那样与存储库通信、部署和检索信息?这是通过某种公开协议完成的吗?

我找到了有关OSGI(和OBR)的信息,但无法确定这是否是我应该研究的。

我希望在.NET中实现这个功能(出于某些原因)。如果有人能指引我正确的组件,让我查看Java源代码也可以,但我更愿意了解协议规范。

[编辑] 我看到了很多关于HTTP的回答。我想进一步澄清,我不是在寻找传输协议,而是在寻找API协议。例如,简单对象访问协议(SOAP)使用超文本传输协议传输消息。Maven的访问协议是什么?


我不是100%确定,但我认为它只是使用GET和POST的普通http。 - André Stannek
我不明白OSGi与此有任何关系。无论如何,还要注意有几个项目使用Maven仓库,例如Gradle、Ivy等等。 - Dave Newton
这与你的问题不直接相关,但是我们使用Maven构建C#项目并使用Sonar的maven-dotnet-plugin(来自codehaus.org)取得了非常好的成功。只是想提一下,因为你提到了.NET和Maven。 - Allan
谢谢你,艾伦。我正在开发自己的构建系统。我非常喜欢Maven的结构,因此我想使用POM和Maven存储库,而不必完全移植该系统。我的挑战是要么外壳式调用Maven,要么只移植我需要的部分。我选择后者。 - Phillip Scott Givens
5个回答

17

正如 khmarbaise 已经说过的那样,转移协议在大多数情况下是 http(s),但也有其他可用的协议,例如本地存储库的简单文件访问、WebDAV、SCP、SFTP 等。Maven 存储库更多的是一个特殊的目录布局。有像 Nexus 或 Artifactory 这样的服务器提供额外的功能,例如代理远程存储库或某些身份验证检查。

https://maven.apache.org/guides/introduction/introduction-to-repositories.html

摘自 http://wiki.jfrog.org/confluence/display/rtf/repository+layouts Maven 存储库布局: [orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]

示例 org/eclipse/jetty/jetty-ajp/7.0.2.v20100331/jetty-ajp-7.0.2.v20100331.jar


1
在您的回答中,我是否应该假设“Maven Repository Layout”翻译为REST API?也就是说,我可以调用GET http://www.myrepo.com/my.org/myartifact/1.0/item.jar并获取我的构件吗? - Phillip Scott Givens
1
是的,如果你使用像Artifactory、Nexus这样的服务器,或者仅仅遵循布局并使用普通的HTTP服务器,那么它将可以通过简单的GET请求工作;但版本信息会在文件名中重复出现,并且组织ID会被展开,如myrepo.com/my/org/myartifact/1.0/myartifact-1.0.jar - Leonard Brünings

5
通常的协议是http,此外对于.net,已经存在一个解决方案,称为nuget,它已经支持并与一些仓库管理器(如neuxs和artifactory)配合使用。
啊...Maven使用自己的协议。没有SOAP等。也许看一下这里会有所帮助。而且这个也是如此。
更新:您可以通过wget从Maven存储库下载工件...这只是一个http-get操作。要上传工件只需进行http-put即可...您可以使用curl完成此操作。

更准确地说,Nexus支持使用Maven期望的结构公开工件。 - millimoose
这个答案离题了。我问的是关于Maven的,你却告诉我关于Nuget的。 (踩) - Phillip Scott Givens
但是你要求使用 .net(出于某种原因)。嗯...有趣...我只想给一个提示,类似这样的东西已经存在了。 - khmarbaise
没错。我不是简单地询问如何以任何方式获取软件包。 "this" 指的是通过 Maven 协议进行通信。 - Phillip Scott Givens
1
“wagon”并不是一个协议,它并没有规定在网络连接中需要传输什么。它只是一个统一的API,最终实现了“将$ARTEFACT上传到存储库$URL”的概念。它更像是一个客户端规范,要求符合部署工件协议的规范。 - millimoose

3
严格来说,Maven 没有特殊的访问协议。 Maven 使用普通的 HTTP 从仓库获取构件。 仓库应该有特殊的布局,即 URL 结构(这简单地映射到通常的目录结构)。 您可以通过以特定方式组织目录来组织自己的 repo:[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext],无需在服务器端使用任何特殊软件。
因此,它更多关于目录结构而不是特殊协议。非常简单且有效的方法。
当然,如果您想要额外的服务(如搜索、访问控制、统计数据等),则需要自行实现。这就是 JFrog 使用其 Artifactory 产品的原因。

2
据我所知,实际上并没有一个具体的协议。Maven仓库只是一种特定的资源结构,可通过HTTP(或本地目录)访问。在Codehaus上有一个有点过时的描述可供参考。
“部署到”存储库意味着以您希望的任何方式上传文件,只要稍后可以从上述布局中获取即可。deploy插件的文档提供了FTP和SSH的示例,这意味着将文件简单地上传到此类目录结构中。但您也可以将文件上传到自定义Web服务中,该服务将它们存储在数据库中,然后适当地通过HTTP公开。Maven并不会关心;工件部署、存储和存储库访问是解耦的。

0

HTTP GET,格式如下:

GET /content/repositories/approved-from-central/commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.pom HTTP/1.1
Cache-control: no-cache
Cache-store: no-store
Pragma: no-cache
Expires: 0
Accept-Encoding: gzip
User-Agent: Apache-Maven/3.3.9 (Java 1.8.0_102; Windows 7 6.1)
Host: localhost
Connection: Keep-Alive

我在这里记录了它 http://www.javamonamour.org/2017/10/maven-to-repository-protocol.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接