当前位置: 首页 > 知识库问答 >
问题:

默认的Maven插件版本是如何决定的?

萧卜霸
2023-03-14

我想知道什么时候我没有在一些模块的pom.xml中指定插件版本:

<build>
...
<plugin>
   <groudId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.8.0</version>
</plugin>
...
</build>

当我运行“mvn编译”时,默认使用的插件版本是什么?

我已经试过了,实际上它使用的是maven编译器插件version3.1,上面的插件元素被注释了,我的maven版本是3.6.3。

我花了1个小时通过谷歌搜索Maven的文档和相关帖子,但没有找到确切的答案。我真的很想知道这个版本是如何决定的?

共有2个答案

姜建德
2023-03-14

maven在不定义工件版本的情况下是不可能工作的,所以这里必须提到,让我们一部分一部分地深入研究。

所有的pom.xml都是从超级POM逻辑上继承的。你总是可以看到你的真正的pom.xml看起来像通过键入:

mvn help:effective-pom

结果是pom。打印的xml是超级POM(您的POM)的组合。xml,以及混合中的任何父POM。

注意,在Maven 3中,super POM不包含任何(默认生命周期)插件版本,但在Maven 2之前,它曾经包含过。

Maven 3 super POM由org提供。阿帕奇。专家模型超级妈妈。DefaultSuperImproviderclasshttps://github.com/apache/maven/blob/bce33aa2662a51d18cb00347cf2fb174dc195fb1/maven-model-builder/src/main/java/org/apache/maven/model/superpom/DefaultSuperPomProvider.java#L56-L85

它加载的资源可在此处找到:https://github.com/apache/maven/blob/bce33aa2662a51d18cb00347cf2fb174dc195fb1/maven-model-builder/src/main/resources/org/apache/maven/model/pom-4.0.0.xml#L23-L149

编辑:

根据Maven坐标

group pIdartifactIdversion都是必需的字段(尽管,group pId和version如果是从父级继承的,不需要显式定义——稍后会有更多关于继承的内容)。这三个字段很像地址和时间戳的合二为一。这标志着存储库中的一个特定位置,就像Maven项目的坐标系:

版本:这是命名拼图的最后一块。group pIdartifactId表示一个项目,但是他们不能描述我们正在谈论的项目的哪个化身。我们想要jUnit: jUnit 2018(版本4.12)还是2007(版本3.8.2)?简而言之:代码更改,这些更改应该被版本化,这个元素使这些版本保持一致。它也在工件的存储库中用于将版本彼此分开。my-project version 1.0文件位于目录结构$M2_REPO/org/codehaus/mojo/my-project/1.0中。

苏凯
2023-03-14

神奇的不是发生在超级pom中,而是在所谓的绑定描述符中,如https://github.com/apache/maven/blob/master/maven-core/src/main/resources/META-INF/plexus/default-bindings.xml.所提供的。然而,他们正在移动到匹配的包装插件,例如,对于位于https://github.com/apache/maven-jar-plugin/blob/master/src/main/filtered-resources/META-INF/plexus/components.xml这些版本还没有更新,因为如果两个拥有不同Maven版本的用户有不同的结果(例如,一个构建失败,另一个没有),那就太奇怪了。因此,最好在pom中指定插件版本,不要依赖Maven提供的默认值。

最后都描述在https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

 类似资料:
  • 我知道我可以在POM中定义这些插件的最新版本。但是为什么默认的maven使用这么旧的版本呢?我是否缺少任何配置?

  • 和子级POM: 在子pom上运行'mvn clean install'将运行编译器插件的两个执行,并且只运行antrun插件的第一个执行,尽管每个插件的第一个执行都绑定到一个阶段。 现在将pluginManagement移动到子POM:

  • 我需要定制的工件安装,不知道如何覆盖默认的(从默认的maven生命周期)。所以我的问题是: 如何在我的pom.xml中配置maven install插件,使其不进行默认安装并执行我的自定义安装文件目标? 我尝试了没有id和默认安装id,但没有帮助。 更新:从提供的答案 - 这对我不起作用(我在日志中看到两次安装尝试)。

  • 有什么建议吗? DS 代码为: 在其上运行命令的: 项目中的位置:

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

  • 我正在阅读这些文档,仍然不知道Maven是如何决定下载哪些版本的插件的。 例如,考虑以下简单场景: 一个空的本地存储库 默认settings.xml 运行一个简单的maven命令。例如,用于,如Maven在5分钟文档中所述。 运行命令后,Maven做的第一件事就是下载一堆插件。 Maven正在下载的一些插件包括: maven-clean-plugin-2.4.1 maven-install-plu