如何在Maven中发布依赖于第三方SNAPSHOT项目的项目

62
我想使用Maven发布插件发布快照项目"foo-1.0-SNAPSHOT"。该项目依赖于尚未发布的第三方模块"bar-1.0-SNAPSHOT"。我在项目的pom.xml中使用"allowTimestampedSnapshots"选项来允许使用时间戳快照,但我认为第三方模块(bar)没有时间戳,除非我自己构建它,因为Maven仍然抱怨无法解决SNAPSHOT依赖项。
是否有一种方法可以发布foo项目而不考虑依赖的快照项目呢?如果没有,我该如何为第三方项目添加时间戳呢?
5个回答

167

问题出在allowTimestampedSnapshots参数名上,它出现在文档中,但插件源代码在表达式中使用了不同的参数名——ignoreSnapshots

因此,只需使用-DignoreSnapshots=true,发布插件的准备目标将忽略快照依赖项。


9
这个方法是有效的,我相信这就是原帖所寻找的正确答案。可惜它没有得到足够的赞数来排名第一!当然,你不会真的想要发布具有快照依赖关系的构件,因为你的用户也需要找到那个快照版本。如果你只是在测试套件(或类似的东西)中使用快照版本,那么"-DignoreSnapshots=true"肯定是一个很好的解决办法。 - joelittlejohn
1
我差点放弃,直到我偶然发现了这个!谢谢! - Kenny Cason

26

使用 maven-release-plugin 选项

-DignoreSnapshots=true

而不是

-DallowTimestampedSnapshots=true

在我的情况下提供了帮助,这将允许使用带有快照版本的依赖项来准备并执行发布操作。

应该非常小心地处理此选项,因为在发布中使用快照版本可能会在稍后破坏您的发布,如果快照依赖项得到更新,而这在正常情况下并不是您想要的。


10
短答案是请查看以下答案... 长答案是你可以绕过这个问题。
过去我处理这个问题的唯一方法就是有效地分叉第三方库并自己发布一个版本。当然,如果库很大且复杂,这只是说起来容易做起来难;而且如果第三方库是闭源的话,则根本不可能。更容易的方法可能是联系第三方要求他们发布一个版本。
另一个选择是复制他们的POM(确保没有快照),更改版本信息,并手动将POM和构件安装到您的存储库中。

8
不完全正确,参考其他答案,你可以通过 -DignoreSnapshots=true 告诉Maven忽略快照依赖项并进行发布。但是,应该避免这样做,只有在绝对没有其他选择的情况下才这样做,这是另一回事。 - Alexander Klimetschek
1
Sonatype的建议是部署到本地仓库http://blog.sonatype.com/2009/01/best-practices-for-releasing-with-3rd-party-snapshot-dependencies/#.UstQinlq5t0 - Joseph Earl

6
之前的答案建议更改组和构件id...不要这样做,因为maven在后面发布此依赖项时将无法识别它为同一构件,并且您将在类路径上拥有两个副本。 我更喜欢的方法是仅更改版本,我会这样做:[原始版本]-[我的组织名称]-[我从中提取的svn版本],因此我得到类似1.0-SONATYPE-3425的东西。通过使用svn rev,我可以随时再次获取源代码并进行修补(如果需要),并确切地知道我正在使用什么而不必将整个源代码拉入我的svn中。
更新 - 我之前写了一篇博客介绍了这个问题。

-2
只需使用您自己的pom文件安装jar包。通常我会更改组和artifact id,以清楚表明这不是官方版本,但这通常是解决您问题的最佳方法。

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