【发布时间】:2011-11-02 07:03:03
【问题描述】:
鉴于在官方文档中很难找到任何关于依赖版本范围的信息(我能想到的最好的方法是 http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict+Resolution),我想知道它们是否仍被视为 Maven POM 的一等公民。
我想大多数人都会同意这是一种不好的做法,但我想知道为什么很难找到有关它的任何官方信息。
【问题讨论】:
鉴于在官方文档中很难找到任何关于依赖版本范围的信息(我能想到的最好的方法是 http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict+Resolution),我想知道它们是否仍被视为 Maven POM 的一等公民。
我想大多数人都会同意这是一种不好的做法,但我想知道为什么很难找到有关它的任何官方信息。
【问题讨论】:
它们并没有在正式意义上被弃用,它们将在未来的版本中被删除。然而,它们的局限性(以及随后缺乏广泛采用)意味着它们不如最初预期的那么有用,而且如果不进行重大重新思考,它们不太可能得到改进。
这就是为什么文档仅以设计文档的形式存在 - 它们存在,但重要的用例从未完成到我建议普遍使用它们的地步。
如果您有一个当前有效的用例,并且可以适应这些限制,您可以期望它们在可预见的未来继续工作,但除此之外几乎没有什么工作要做。
【讨论】:
我不知道您为什么认为没有记录版本范围。 Maven Complete Reference 文档中有一个具体的摘要。
尽管如此 - 一个巨大的问题(在我看来)是记录在案,“依赖范围的解析不应解析为快照(开发版本),除非它被包含为明确的边界。”(您提供的链接)但系统的行为不同。如果您使用版本范围,如果它们存在于您的范围中,您将获得 SNAPSHOT 版本 (MNG-3092)。是否需要的讨论还没有结束。
目前 - 如果您使用版本范围 - 您可能会获得 SNAPSHOT 依赖项。所以你真的必须小心并决定是否需要这样做。它可能对您自己开发的依赖项有用,但我怀疑您是否应该将它用于 3rd 方库。
【讨论】:
版本范围是 Maven 仍然有用的唯一原因。即使考虑不使用它们也是不好的做法,因为它会导致您陷入多模块构建、非功能性父 pom、需要 10 分钟或更长时间的构建、结构不良的项目(如我们在非法项目中介绍的 Spring、Hibernate 和 Wicket)的灾难争论播客。
为了回答您的问题,它们并未被弃用,并且在许多项目中都成功使用(除非 Sonatype 允许损坏的元数据进入 Apache Maven Central)。
如果您想要一个非常好的非多模块构建示例(仅限reactor.xml),其中版本范围被广泛使用,请查看粘性代码(http://code.google.com/p/stickycode /)
【讨论】: