You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle复合构建下自定义Settings插件无法应用:找不到插件ID

问题描述

我有一个名为core的Gradle 8.1多项目库(会发布供其他项目依赖),其中包含sanny-gradle-plugins模块,该模块实现了一个Settings插件eu.sanny.core.gradle.plugins.MyTestPlugin,代码如下:

class MyTestPlugin : Plugin<Settings> {
    override fun apply(settings: Settings) {
        println("Hello sanny 1")
        println("Plugin ${this.javaClass.simpleName} applied on ${settings.rootProject.name}")
        settings.gradle.beforeProject {
            println("Hello sanny 2")
        }
    }
}

该模块的build.gradle.kts配置:

plugins {
    `kotlin-dsl`
    `java-gradle-plugin`
    `maven-publish`
}

dependencies {
    implementation(kotlin("stdlib"))
    implementation(gradleApi())
}

gradlePlugin {
    plugins {
        create("my-test-plugin") {
            id = "my-test-plugin"
            displayName = "My Test Plugin"
            implementationClass = "eu.sanny.core.gradle.plugins.MyTestPlugin"
        }
    }
}

额外手动添加了resources/META-INF/gradle-plugins/my-test-plugin.properties文件:

implementation-class=eu.sanny.core.gradle.plugins.MyTestPlugin

在core父项目的settings.gradle.kts中,尝试通过pluginManagement引入构建并应用插件:

pluginManagement {
    includeBuild("sanny-gradle-plugins")
    repositories {
        mavenLocal()
    }

    plugins {
        val springBootPluginVersion: String by settings
        val kotlinPluginVersion: String by settings

        id("my-test-plugin")
        kotlin("jvm") version kotlinPluginVersion
        kotlin("plugin.spring") version kotlinPluginVersion
        kotlin("plugin.jpa") version kotlinPluginVersion
    }

    // 应用插件时触发错误
    apply(plugin = "my-test-plugin")

...

构建时出现错误:Plugin with id 'my-test-plugin' not found.,尝试将apply放在pluginManagement内外均无效。

错误原因
  1. 插件应用时机过早:pluginManagement块是Gradle Settings阶段最早执行的逻辑之一,用于配置插件仓库和版本管理,此时通过includeBuild引入的sanny-gradle-plugins构建还未被Gradle加载解析,自然找不到插件ID。
  2. 插件声明逻辑冗余且错误:pluginManagement内的plugins{}块仅用于预声明插件版本(或无版本),不负责引入本地包含构建的插件,在这里声明id("my-test-plugin")完全多余,反而会干扰Gradle的插件解析逻辑。
  3. 手动生成的插件配置文件可能冲突:java-gradle-plugin插件会自动生成META-INF/gradle-plugins/下的插件配置文件,手动添加同名文件可能导致解析异常(虽然这次不是直接原因,但属于冗余操作)。
解决方法

步骤1:调整Settings文件的插件应用位置

将插件应用代码移到pluginManagement块之外的Settings主逻辑中,确保includeBuild已经被处理后再应用插件。修改后的settings.gradle.kts示例:

pluginManagement {
    includeBuild("sanny-gradle-plugins")
    repositories {
        mavenLocal()
    }

    plugins {
        val springBootPluginVersion: String by settings
        val kotlinPluginVersion: String by settings

        kotlin("jvm") version kotlinPluginVersion
        kotlin("plugin.spring") version kotlinPluginVersion
        kotlin("plugin.jpa") version kotlinPluginVersion
    }
}

// 在这里应用插件,此时includeBuild已被Gradle处理,插件可被发现
apply(plugin = "my-test-plugin")

// 其他Settings配置,比如引入子项目
include(":your-other-modules")

步骤2:移除手动添加的插件配置文件

删除sanny-gradle-plugins模块中手动创建的resources/META-INF/gradle-plugins/my-test-plugin.properties文件,因为java-gradle-plugin会自动生成正确的配置文件,手动添加可能引发潜在冲突。

步骤3:验证插件配置一致性

确认gradlePlugin配置中的implementationClass值与MyTestPlugin类的实际包名、类名完全一致,避免因类路径错误导致插件无法被加载。

后续跨项目使用说明

如果要让其他依赖core库的项目使用该插件,需要先将sanny-gradle-plugins模块发布到仓库(比如mavenLocal或私有仓库),然后在目标项目的settings.gradle.kts中配置对应仓库并应用插件:

pluginManagement {
    repositories {
        mavenLocal()
        // 添加你的插件仓库地址
    }

    plugins {
        id("my-test-plugin") version "your-plugin-version"
    }
}

apply(plugin = "my-test-plugin")

内容的提问来源于stack exchange,提问作者Alexander Art

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:05:34