Maven如何从存储库解析SNAPSHOT版本

时间:2019-02-13 10:55:07

标签: java maven

我正在开发一个托管Maven存储库的服务器,如果快照不是特定格式,则Maven会错误地解决SNAPSHOT版本的问题。在查找了版本规则之后,我知道限定词可以是任何字符串,因此我希望maven能够下载任何限定词的依赖项。但是,这与我的经验不符。

存储库具有以下文件夹结构(假设Maven项目a.b.c:a.b.c.d:1.0.0-SNAPSHOT):

<repo-root>
|-a
 |-b
  |-c
   |-a.b.c.d
    |-maven-metadata.xml
    |-1.0.0-SNAPSHOT
     |-a.b.c.d-1.0.0-20190213.120000-1.jar
     |-maven-metadata.xml

如果我尝试解决a.b.c.d-SNAPSHOT,则效果很好。我可以在Maven日志中看到它查找a/b/c/a.b.c.d/1.0.0-SNAPSHOT/maven-metadata.xml,然后下载正确的JAR文件。到目前为止一切顺利。

但是,如果我将限定符更改为其他名称(例如在末尾删除-1),则maven无法解析该文件!而不是寻找

<repo-root>/a/b/c/a.b.c.d/1.0.0-SNAPSHOT/<jar-file>

(这是正确的),它看起来是

<repo-root>/a/b/c/a.b.c.d/1.0.0-20190213.120000/<jar-file>

这显然是错误的。每种不符合格式的限定符都会发生这种情况

\d\.\d\.\d-\d{8}.\d{6}-\d+

为什么Maven无法解析此类限定词?是在某处指定了格式还是仅仅是Maven错误?

1 个答案:

答案 0 :(得分:2)

通常,Maven版本可以是任何String(例如1.2.3-RELEASE1-1456dontknow)。以-SNAPSHOT结尾的版本具有特殊含义,它们可以针对最新的构建版本进行解析。

一个特定的SNAPSHOT(例如1.0-SNAPSHOT)的不同版本通过您在问题中提到的时间戳来区分。我不知道这种格式是否真的是“ Maven标准”,但我猜是这样,因为在所有常见的存储库管理器中都一样,并且您在不使用它时遇到了问题。我强烈建议您不要使用不同类型的时间戳,即使您可以使用它也是如此,因为每个Maven插件都希望带有时间戳的SNAPSHOT版本具有已定义的既定格式(无论是否“正式”)。

顺便说一句:我很想听听您为什么开发自己的Maven存储库。