如何在不使用 usePluginRegistry 的情况下全局设置 Maven 插件版本?

How to globally set a Maven plugin version without usePluginRegistry?

我现在的处境是,我们已将许多项目移至 Docker-in-Docker 构建并使用多阶段 Docker 文件,从使用 Maven 自定义基础镜像来构建我们的项目,然后将工件复制到可部署的镜像中。我们在仅复制 POM 后使用初始 dependency:go-离线步骤编写了我们的 Docker 文件,以便缓存具有依赖项的层,以便在从开始时尽量减少构建时间空图像。

问题是我们刚刚被 https://issues.apache.org/jira/browse/MDEP-204 绊倒,这是一个相当古老的错误,后来在 maven-dependency-plugin 的更新版本中得到了解决。然而,Maven 似乎默认为一个相当古老的。

第一, 我想了一会儿,我可以在我们的基本图像中使用 plugin-registry.xml 文件来强制 Maven 默认为更新版本,但似乎该功能已被弃用,我没有找到任何运气它被其他任何东西取代了。

THEN, 我想尝试变得非常奇怪和偷偷摸摸,看看我是否可以以某种方式修改 Super-POM 以更改插件的默认版本,但那没有工作。 Super-POM 中的版本与 Maven 默认的版本不同,而且不同的项目默认使用不同版本的插件,并且 none 他们在他们的 POM 中指定。有没有像 help:effective-pom 或 dependency:tree 的插件感知版本可以告诉我为什么有些项目选择特定版本的方法?

我需要 Maven 在执行 go-offline 时可靠地使用正确版本的插件,但我不确定除了直接在命令中之外我可以在哪里控制它,但我想避免必须修改每个人 Dockerfile.

是否还有我可以构建到 Builder 映像中的全局机制来一次为每个项目升级插件,我该如何使用它?还是我运气不好?

略有不正确但值得思考的简短回答是:你不能。

项目负责决定为其目的使用的插件版本,例如,可以在其 pom.xml 中硬编码插件版本。从外部覆盖这样的东西会导致构建与作者预期的不一样。

但是,请看下面:

较长的答案是:这在某种程度上取决于您想做什么。如果你真的想要做的只是 运行 go-offline goal,顺便说一句,遗憾的是,这不会使你的 Maven 运行 完全 ] 独立于网络,您可以从命令行 运行 一个单独的插件目标,并且,当您这样做时,您可以指定您想要的插件的任何版本。此命令行调用应 运行 使用 maven-dependency-plugin:

版本 3.1.2 的相关目标
$ mvn org.apache.maven.plugins:maven-dependency-plugin:3.1.2:go-offline