【问题标题】:How to get Maven to use the latest versions of certain plugins?如何让 Maven 使用某些插件的最新版本?
【发布时间】:2011-05-12 17:57:06
【问题描述】:

我只是因为 maven-compiler-plugin v2.0.2 中的一个错误而浪费了 2 个小时,该错误已在 v2.3.2 版本中修复。

显然,如果您不指定 Maven 编译器插件的版本,Maven 2.2.1 只会为您提供 v2.0.2。

我们的项目使用 15 多个 Maven 插件。其中一些我们想确定某个版本,但其中大部分(如编译器插件)我们想升级而不用考虑它。

有没有办法使用 Maven 自动执行此操作,或者我们是否必须分配某人每月研究可能的 Maven 插件升级然后更改父 POM 中的 PluginManagement 版本号这一吃力不讨好的任务?

【问题讨论】:

  • 这不是直接适用的,但是当你没有为插件提供版本号时,maven3会给出一个警告,指出警告是为了向后兼容。
  • @Jeremy 不向后兼容的更改将在 Maven 3.1 中。同时,Maven 3.0 帮助你修复你的 pom。

标签: java maven-2 plugins build build-process


【解决方案1】:

您可以将versions-maven-plugin 之类的内容与您的主要构建相关联,这样您就可以获得每个构建的报告,显示您的插件是否是最新的。

有关详细信息,请参阅此链接:Display Plugin Updates

如果您想变得花哨,请让您的 CI 服务器通过脚本运行您的 maven 构建的输出,以检查指示新版本的 [WARNING] 日志条目,然后让它通过电子邮件或其他方式通知您团队的相关成员其他通知。

【讨论】:

  • 天哪...已经使用 Maven 2 年多了,不知道我可以运行 mvn versions:display-plugin-updates 并获取所有有用的信息。它仍然必须手动完成,但这确实很容易。与 mvn 版本相同的常规依赖项:display-dependency-updates -- 谢谢。
【解决方案2】:

显然,如果您不指定 Maven 编译器插件的版本,Maven 2.2.1 只会为您提供 v2.0.2。

是的,从Maven 2.0.9(参见MNG-3395)开始,核心和常用插件的版本已在super POM 中得到修复,并且为了构建可重复性,Maven 禁用了插件版本发现。

我们的项目使用 15 多个 Maven 插件。其中一些我们想确定某个版本,但其中大部分(如编译器插件)我们想升级而不用考虑它。

如上所述,这是一个坏主意。您根本不希望 Maven 构建由于某些插件更新而突然开始失败。换句话说,您应该使用固定版本,而不这样做是不好的做法。实际上,Maven 3.0 提倡这种做法,如果你不这样做,就会警告你。而在 3.1 中,您必须指定一个版本(请参阅 MNG-1968)。

就我个人而言,我使用Maven Enforcer Plugin 及其Require Plugin Versions 规则来强制执行这种做法(这意味着如果您不锁定插件版本,构建将失败)。

有没有办法使用 Maven 自动执行此操作,或者我们是否必须分配某人每月研究可能的 Maven 插件升级然后更改父 POM 中的 PluginManagement 版本号这一吃力不讨好的任务?

正如建议的那样,Versions Maven Plugin 的目标是允许检查是否有更新版本的插件、依赖项等(请注意,-cpu 在 Maven 3.0 中已弃用,并将从未来版本中删除)。

但真正的问题是:为什么要始终使用终极版本? IMO,没有充分的理由这样做,只有在需要修复的情况下才应该升级(“如果没有损坏,请不要修复它”)。

底线:使用固定的插件版本,忘记自动更新、版本范围等。

【讨论】:

  • +1 为此:'就个人而言,我使用 Maven Enforcer Plugin 及其 Require Plugin Versions 规则来强制执行此做法(这意味着如果您不锁定插件版本,构建将失败)。 '
  • @javamonkey79:这是我最喜欢的插件之一。我在所有构建中都使用它。
【解决方案3】:

您也可以在插件中使用版本范围。

【讨论】:

  • Baaaaaaaaaaaad 练习,不要这样做。
  • @Pascal:你这么说很有趣。对于依赖项,我们的团队已经同意这是值得的更多痛苦。但是与插件一起适当使用,这是一件坏事吗?这也向我提出了一个问题:如果一般来说这是不好的做法,那么它的用例是什么?
  • 在我看来,没有有效的用例(虽然 Maven 确实 support 版本范围,但我相信它不鼓励使用它们)。
  • 理论上,如果人们遵守版本控制标准(例如来自 Apache 的标准),那么可以使用合理的范围(例如直到下一个小版本)。但是,我认为问题在于未能遵守标准。尽管如此,我明白你的观点,并会在 99% 的所有用例中阻止它们 - 我只是希望更好地遵守正确的版本控制,这样范围可以更有用。
  • 在我看来,最大的问题并不是真正的版本解析(这可以在遵循您指出的标准时起作用),问题是版本范围可能会导致您的构建和狩猎等不必要的行为变化问题是一种痛苦(你不能区分 POM,你不能轻易地恢复到工作状态)。版本范围是通往地狱之门的入口。
【解决方案4】:

我今天第二次写这个:

尝试使用-cpu 标志。来自mvn -help的输出:

usage: mvn [options] [<goal(s)>] [<phase(s)>]

Options:
 -cpu,--check-plugin-updates            Force upToDate check for any
                                        relevant registered plugins

【讨论】:

  • FWIW,此选项在 Maven 3.0 中已弃用。
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2021-04-18
相关资源
最近更新 更多