Maven插件版本未指定。

29

我刚刚注意到在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中的超级超级pom-4.0.0.xml,以确认maven-bundle-plugin不存在。此插件版本未在任何地方指定。

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


你能展示一下你的示例的完整pom文件吗? - khmarbaise
SSCCE:https://gist.github.com/ceilfors/5840917 - ceilfors
3个回答

28

来自Maven 3.x兼容性说明

自动插件版本解析

当在POM中或命令行中调用插件时没有明确指定版本,Maven 2.x会选择可用的最新版本,其中最新版本可以是发布版或快照版。为了稳定性,Maven 3.x更喜欢最新的发布版本而不是最新的快照版本。

考虑到自动插件版本解析可能导致不可重复的构建风险,针对POM中的插件声明,这个特性已计划删除。Maven 3.x用户将会在检测到缺失的插件版本时输出警告,以鼓励将插件版本添加到POM或其父级POM之一中。还可以使用Enforcer规则requirePluginVersions来检查POM中缺失的插件版本。


3
如果您检查远程存储库(例如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文件”之类的话。您应该始终指定插件版本,以便您的构建可复制。否则,您可能会遇到一些非常难以找到的错误。


1
我注意到了。我只是想知道幕后发生了什么神奇的事情。投票支持,因为它对阅读此内容的人有用。 - ceilfors
直到今天才看到你的更新答案!我刚在Maven 3.x兼容性说明中找到了答案,它使用<release>。请查看我的回答。 - ceilfors

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接