未指定 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 可能会使用<latest>
值来决定下载哪个插件。
Maven 3.0.x 对缺少插件版本给出警告,并说“Maven 的未来版本可能会拒绝构建像这样的格式错误的 POM”或类似的东西。您应该始终指定插件版本,以便您的构建可重现。否则你最终可能会遇到一些很难找到的错误。
【讨论】:
我注意到了。我只是想知道幕后发生了什么巫术。投票赞成,因为它对阅读本文的人有用。 直到今天才看到您更新的答案!我刚刚在 Maven 3.x 兼容性说明中找到了答案,它使用的是<release>
。看我的回答。【参考方案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未指定版本导致的编译错误