Gradle约定插件报错:org.gradle.accessors.dm.LibrariesForDeps不存在
解决方案
问题根源
org.gradle.accessors.dm.LibrariesForDeps是Gradle为根项目的deps.versions.toml自动生成的专属访问器类,仅在根项目的构建上下文里有效。你的约定插件作为独立子构建(通过includeBuild引入),有自己的构建生命周期,无法直接读取根项目生成的这个类,因此触发同步失败。
修复方案
方案1:让插件项目自行生成版本目录访问器
修改build-configuration/settings.gradle.kts,确保插件项目能加载版本目录文件并生成自己的访问器:
dependencyResolutionManagement { repositories { gradlePluginPortal() mavenLocal() mavenCentral() } versionCatalogs { create("deps") { // 调整路径指向根项目的deps.versions.toml,确保插件项目能读取到 from(files("../gradle/deps.versions.toml")) } } } rootProject.name = "build-configuration" include(":plugin:convention")
更新插件项目的build.gradle.kts,启用访问器生成并修正全类名配置:
plugins { `kotlin-dsl` } group = "com.example" // 启用版本目录访问器生成 kotlinDsl { experimentalWarning.set(false) } dependencies { compileOnly(deps.kotlin.jvm.gradle.plugin) compileOnly(deps.ktor.gradle.plugin) compileOnly(deps.ktlint.gradle.plugin) compileOnly(files(deps.javaClass.superclass.protectionDomain.codeSource.location)) } gradlePlugin { plugins { register("ktlint-plugin") { id = "ktlint-plugin" // 确保填写完整包名+类名 implementationClass = "com.example.KtlintConventionPlugin" } } }
同时保证KtlintConventionPlugin和VersionCatalog.kt的包名一致(比如都在com.example下),插件项目会自行生成LibrariesForDeps类。
方案2:不依赖自动生成的访问器,手动获取版本目录
修改VersionCatalog.kt,改用Gradle原生API手动获取版本目录,避免跨构建的类依赖问题:
import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalog import org.gradle.api.artifacts.VersionCatalogsExtension internal val Project.deps: VersionCatalog get() = extensions.getByType(VersionCatalogsExtension::class.java).named("deps")
调整插件类中的使用方式:
class KtlintConventionPlugin : Plugin<Project> { override fun apply(target: Project) { with(target) { val ktlintPluginId = deps.findPlugin("ktlint").get().get().pluginId pluginManager.apply(ktlintPluginId) extensions.configure<KtlintExtension> { // ... } } } }
验证步骤
- 删除根项目和插件项目下的
.gradle缓存目录 - 重新执行Gradle同步
- 若使用方案1,检查插件项目的
build/generated/sources/gradle-accessors目录,确认已生成LibrariesForDeps类
内容的提问来源于stack exchange,提问作者peter.o
相关产品推荐
相关产品推荐

