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

2022-09-04 22:39:09

我想知道当我没有在某些模块中指定插件版本时,例如:pom.xml

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

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

我已经尝试过,看到它实际上正在使用带有上述插件元素注释的3.1版本,我的Maven版本是3.6.3。maven-compiler-plugin

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


答案 1

魔术不是发生在超级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-jar-插件,因为如果具有不同Maven版本的2个用户具有不同的结果(例如,一个具有损坏的构建,另一个没有),那将是很奇怪的。因此,最好在pom中指定插件版本,不要依赖Maven提供的默认值。bindings descriptor

最后,这一切都在 https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html


答案 2

如果不定义工件的版本,maven就不可能工作,因此必须提到某个地方,让我们部分地挖掘。

所有 s 在逻辑上都是从超级 POM 继承而来的。您始终可以通过键入以下内容来查看“真实”的样子:pom.xmlpom.xml

mvn help:effective-pom

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

请注意,从Maven 3开始,超级POM不包含任何(默认生命周期)插件版本,但更早之前,直到Maven 2它曾经有过。

Maven 3 超级 POM 由 class https://github.com/apache/maven/blob/bce33aa2662a51d18cb00347cf2fb174dc195fb1/maven-model-builder/src/main/java/org/apache/maven/model/superpom/DefaultSuperPomProvider.java#L56-L85org.apache.maven.model.superpom.DefaultSuperPomProvider

它可以在这里找到它加载的资源: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坐标

groupId:: 都是必填字段(尽管,如果 groupId 和版本是从父级继承的,则不需要显式定义它们 - 稍后将详细介绍继承)。这三个字段的作用很像一个地址和时间戳。这将标记存储库中的特定位置,就像 Maven 项目的坐标系一样:artifactIdversion

版本:这是命名难题的最后一块。:表示单个项目,但它们无法描述我们正在谈论的项目的化身。我们想要 2018 年的 junit:junit(版本 4.12)还是 2007 年的 junit:junit(版本 3.8.2)?简而言之:代码更改,这些更改应该进行版本控制,并且此元素使这些版本保持一致。它还在工件的存储库中用于将版本彼此分开。my 项目 1.0 版文件位于目录结构中groupIdartifactId$M2_REPO/org/codehaus/mojo/my-project/1.0.


推荐