23

我刚刚注意到插件的版本在 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 是如何确定采用哪个版本的?

4

3 回答 3

23

来自Maven 3.x 兼容性说明

自动插件版本解析

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

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

于 2015-03-01T08:57:11.327 回答
3

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

<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>

我认为<latest>如果未指定版本,Maven 可能会使用该值来决定下载哪个插件。

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

于 2013-06-21T17:34:14.550 回答
0

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

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

于 2013-06-21T15:59:13.123 回答