未指定 Maven 插件版本

Posted

技术标签:

【中文标题】未指定 Maven 插件版本【英文标题】:Maven plugin version not specified 【发布时间】:2013-06-18 19:55:17 【问题描述】:

我刚刚注意到插件的版本在 maven 中是可选的。我仍然可以构建我的模块而不指定它。我们以 maven-bundle-plugin 为例。

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    ....
</plugin>

我写了一个没有父级的简单 pom.xml 来尝试这个,所以不涉及 pluginManagement。我还检查了 maven-model-builder 中的 super super pom-4.0.0.xml 以确认 maven-bundle-plugin 不存在。此插件版本未在任何地方指定。

maven如何确定采用哪个版本?

【问题讨论】:

你能展示你的例子的完整 pom 文件吗? SSCCE:gist.github.com/ceilfors/5840917 【参考方案1】:

来自Maven 3.x Compatibility Notes:

自动插件版本解析

当在 POM 中没有给出明确版本的情况下调用插件时 或者在命令行上,Maven 2.x 用来选择最新版本 在最新版本可以是发行版或 快照。 为了稳定,Maven 3.x 更喜欢最新的 发布版本优于最新的快照版本。

鉴于威胁 由自动插件版本强加的不可复制的构建 解决方案,此功能计划删除至插件 POM 中的声明是相关的。 Maven 3.x 的用户会发现它 检测到缺少插件版本时输出警告 鼓励将插件版本添加到 POM 或其之一 父 POM。可以使用 Enforcer 规则 requirePluginVersions 另外检查 POM 中缺少的插件版本。

【讨论】:

【参考方案2】:

如果您在插件工件旁边检查远程存储库(例如 Nexus)中的 maven-metadata.xml 文件,您会看到如下内容:

<metadata>
    <groupId>com.company.maven.plugins</groupId>
    <artifactId>some-maven-plugin</artifactId>
    <versioning>
      <latest>0.3.6</latest>
      <release>0.3.6</release>
      <versions>
        <version>0.1</version>
        <version>0.2</version>
        <version>0.3.0</version>
        <version>0.3.1</version>
        <version>0.3.2</version>
        <version>0.3.4</version>
        <version>0.3.5</version>
        <version>0.3.6</version>
      </versions>
      <lastUpdated>20140414212942</lastUpdated>
    </versioning>
  </metadata>

我认为如果没有指定版本,Maven 可能会使用&lt;latest&gt; 值来决定下载哪个插件。

Maven 3.0.x 对缺少插件版本给出警告,并说“Maven 的未来版本可能会拒绝构建像这样的格式错误的 POM”或类似的东西。您应该始终指定插件版本,以便您的构建可重现。否则你最终可能会遇到一些很难找到的错误。

【讨论】:

我注意到了。我只是想知道幕后发生了什么巫术。投票赞成,因为它对阅读本文的人有用。 直到今天才看到您更新的答案!我刚刚在 Maven 3.x 兼容性说明中找到了答案,它使用的是&lt;release&gt;。看我的回答。【参考方案3】:

maven 遵循几​​个步骤来解析插件版本。 记录在Resolving Plugin Versions 部分 http://maven.apache.org/guides/introduction/introduction-to-plugin-registry.html

自这篇文章 7 年以来,文档似乎已被移动。正如@ceilfors 在他的回答中提到的那样,它可以在Maven 3.x Compatibility Notes 获得。

【讨论】:

这里的第 3 步不同:maven.apache.org/guides/introduction/…。一个说 checkLatest 默认启用,另一个说默认禁用。哪一个是正确的?我也找不到 M2_HOME/conf/plugin-registry.xml 文件。我正在使用 Maven 3.0.4。 现在不炒了 @Sniper,损坏的链接已更新。请参阅上面的ceilfors 答案。

以上是关于未指定 Maven 插件版本的主要内容,如果未能解决你的问题,请参考以下文章

Proguard Maven 插件不使用指定的 Proguard 版本

spring-boot-maven-plugin未指定版本导致的编译错误

spring-boot-maven-plugin未指定版本导致的编译错误

maven 插件

Maven 发布插件:指定新的开发版本不影响 pom 的自定义属性

maven 编译插件指定jdk版本的两种方式