未指定Maven插件版本

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

 org.apache.felix maven-bundle-plugin true ....  

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

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

来自Maven 3.x兼容性说明 :

自动插件版本解析

当在没有POM或命令行中给出的显式版本的情况下调用插件时,Maven 2.x用于选择最新版本可用的最新版本,其中最新版本可以是版本或快照。 为了稳定起见,Maven 3.x更喜欢最新版本的最新版本。

鉴于自动插件版本解析所施加的不可重现构建的威胁,就POM中的插件声明而言,此function计划被删除。 当检测到丢失的插件版本时,Maven 3.x的用户会发现它会输出警告,以鼓励将插件版本添加到POM或其父POM之一。 可以使用Enforcer规则requirePluginVersions来检查POM中缺少的插件版本。

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

  com.company.maven.plugins some-maven-plugin  0.3.6 0.3.6  0.1 0.2 0.3.0 0.3.1 0.3.2 0.3.4 0.3.5 0.3.6  20140414212942   

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

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

以下几个步骤可以解决插件版本问题。 它在http://maven.apache.org/guides/introduction/introduction-to-plugin-registry.html的 Resolving Plugin Versions部分中有记录。