注入 Maven 插件依赖项运行时

Posted

技术标签:

【中文标题】注入 Maven 插件依赖项运行时【英文标题】:Inject Maven Plugin Dependencies runtime 【发布时间】:2021-11-19 01:34:28 【问题描述】:

是否可以在运行时在 maven 插件和/或 gradle 插件中注入依赖项。我知道您可以在 pom.xml 中的插件中添加依赖项,但我希望这些依赖项是运行时的,因为我希望能够注入类似这样的东西 mvn <plugin>:<goal> <arg=pass dependencies here)

这个插件不在 repo pom.xml 中,所以我想运行 mvn cli 在项目之外执行这个插件。有人做过吗

Add Plugin Dependencies Runtime

【问题讨论】:

你为什么要这样做? 它是一个自定义插件,我在屏幕截图中使用了一个不好的 spring boot plugin 示例。我不知道这是否可行,如果它需要更改插件代码,我可以接受。我可以自定义插件代码。我只需要能够将不同的依赖项和/或升级的依赖项版本传递给插件,因为我必须在 100 个 repo 中运行它,我无法更新每个项目的 pom。如果它需要更改插件代码,如果您知道是否有任何开源插件可以做到这一点,如果您能指出该插件,我将不胜感激 听起来像是 X-Y 问题。 Maven 的方式是在你的数百个存储库中修复它,并正确地执行它,而以其他方式执行它会给你带来更多的问题。您可能想查看 XSLT 来操作 pom 的 【参考方案1】:

您可以定义一个附加属性,例如:

<properties>
    <plugin.dependency.version>someDefaultVersion</plugin.dependency.version>
</properties>

并在插件中使用

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>$spring-boot.verision</version>
            <dependencies>
                <dependency>
                    <groupId>groupid</groupId>
                    <artifactId>artifactId</artifactId>
                    <version>$plugin.dependency.version</version>
                </dependency>
            </dependencies>
        </plugin>

通过这样做,您应该能够使用以下命令通过命令行定义插件的依赖关系:

mvn org.springframework.boot:spring-boot-maven-plugin:yourGoal -Dplugin.dependency.version=runtimeDepenencyVersion

【讨论】:

这不适合我,我猜 Spring Boot 插件是一个不好的例子,它是一个不同的插件。并且该插件并未添加到所有项目中。我有 1000 个 repo,我想在其中运行这个插件目标,但具有不同的运行时依赖项。为了让您的解决方案正常工作,我必须将此插件添加到每个项目中。 我也刚刚意识到,我无法在 settings.xml 中添加插件 这些存储库是否共享同一个 pom 父级?如果是这样,那么插件只能添加到父 pom 中,这样所有项目都会从中受益。既然你说你可以自定义插件代码,我假设你也可以发布它。另一种选择是发布同一插件的一堆不同版本,每个版本都有不同的依赖项。然后你可以运行你的插件:mvn yourPluginGroupId:yourPluginName:specificVersionOfThePluginWhichHasNeededDependencies:yourGoal【参考方案2】:

使用 标签来执行此操作。示例如下:

   <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
        <scope>runtime</scope>
   </dependency>

【讨论】:

这行不通,因为我必须在 pom 中添加此依赖项,我无法为 1000 多个项目执行此操作,并且依赖项可以更改或升级,因此我需要它以方便将来升级和增强。 数千个项目?这到底是怎么回事?

以上是关于注入 Maven 插件依赖项运行时的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Kubernetes 的容器在 runsc (gVisor) 上作为 Docker 中的运行时运行时会失败?

DirectX 11:运行简单的 DirectX 应用程序时运行时崩溃

Gradle 依赖项未列出本地 maven jar 的依赖项

应用程序在调试时运行时如何禁用 Firebase 崩溃报告?

使用ActiveSheet.Range时运行时错误13“类型不匹配”

仅在需要时注入模块依赖项(如插件)