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

Gradle 7.2自定义插件如何在apply方法中调用Version Catalog版本目录

问题修复方案

1. 先确认自定义插件项目的依赖配置

你需要在插件自身的构建脚本中引入Version Catalog的官方依赖,确保编译期能访问到对应类,Gradle 7.2版本对应配置如下(以build.gradle.kts为例):

plugins {
    `java-gradle-plugin`
    kotlin("jvm") version "1.6.10" // 适配Gradle7.2的kotlin版本
}

dependencies {
    implementation("org.gradle:gradle-version-catalog:7.2")
    // 其余你原有依赖保持不变
}

2. 调整Version Catalog的获取逻辑

报错的核心原因是VersionCatalogsExtension的注册时机晚于你插件的apply执行时机,不要直接调用getByType获取,改用监听插件注册的方式触发读取,修改后的apply方法代码如下:

override fun apply(project: Project) {
    // 监听VersionCatalog插件加载完成后再读取配置
    project.plugins.withId("version-catalog") {
        val catalogsExtension = project.extensions.getByType(VersionCatalogsExtension::class.java)
        val libs = catalogsExtension.named("libs")
        addBuildDependencies(project, libs)
    }

    // 其余原有逻辑保持不变
}

3. 优化依赖读取逻辑

findDependency返回的是Optional对象,建议增加空校验避免依赖缺失时直接崩溃,调整后的依赖添加方法如下:

private fun addBuildDependencies(project: Project, libs: VersionCatalog) {
    project.dependencies.apply {
        // BOMs
        libs.findDependency("arrow.bom").ifPresent { bomDep ->
            add(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, project.platform(bomDep))
        }
        libs.findDependency("detekt.bom").ifPresent { bomDep ->
            add(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, project.platform(bomDep))
        }
        // 其余依赖添加逻辑保持相同写法即可
    }
}

补充说明

  • 如果你的自定义插件是给多项目构建使用,需要确保根项目已经正确应用了version-catalog插件且配置了共享catalog的依赖,子项目不需要重复配置,直接应用你的自定义插件即可正常读取依赖。
  • 如果需要兼容未显式应用version-catalog插件的项目,可以改用findByType替代getByType做非空判断,避免直接抛出异常。

内容的提问来源于stack exchange,提问作者A Bit of Help

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:51:04