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

Gradle Kotlin多模块项目中versionCatalog插件使用问题

解决方案:Gradle多模块项目内部复用Version Catalog

问题根源

  1. Gradle的dependencyResolutionManagement属于初始化阶段执行逻辑,此时子模块的构建产物尚未生成,无法直接引用:issuing-commons-dependency的catalog。
  2. VersionCatalogsExtension属于根项目dependencyResolutionManagement的上下文,并非子项目的常规扩展,因此无法在子项目中直接获取。

可行方案

方案一:本地发布+本地仓库引用

  1. 在issuing-commons-dependency模块配置本地临时仓库,用于发布catalog:
// issuing-commons-dependency/build.gradle.kts
plugins {
    `version-catalog`
    `maven-publish`
}

group = "com.yourgroup" // 自定义groupId
version = "1.0.0" // 自定义版本号

catalog {
    versionCatalog {
        version("spring-boot-version", "2.5.12")
        plugin("spring-boot-plugin", "org.springframework.boot").versionRef("spring-boot-version")
        library("spring-webflux", "org.springframework.boot", "spring-boot-starter-webflux").versionRef("spring-boot-version")
        library("spring-web", "org.springframework.boot", "spring-boot-starter-web").versionRef("spring-boot-version")
    }
}

publishing {
    repositories {
        maven {
            url = uri(layout.buildDirectory.dir("maven-local")) // 本地临时仓库路径
        }
    }
    publications {
        create<MavenPublication>("maven") {
            from(components["versionCatalog"])
        }
    }
}
  1. 根项目配置依赖解析,引用本地发布的catalog:
// settings.gradle.kts
dependencyResolutionManagement {
    repositories {
        maven {
            url = uri(project(":issuing-commons-dependency").layout.buildDirectory.dir("maven-local"))
        }
        mavenCentral() // 保留必要的公共仓库
    }
    versionCatalogs {
        create("libs") {
            from("com.yourgroup:issuing-commons-dependency:1.0.0") // 对应子模块的groupId:artifactId:version
        }
    }
}
  1. 执行顺序:先运行./gradlew :issuing-commons-dependency:publish发布catalog到临时仓库,再执行其他构建命令。

方案二:共享Toml源码文件(最直接)

跳过发布流程,将catalog定义提取为根目录的.toml文件,所有模块直接引用:

  1. 根目录创建gradle/libs.versions.toml:
[versions]
spring-boot-version = "2.5.12"

[plugins]
spring-boot-plugin = { id = "org.springframework.boot", version.ref = "spring-boot-version" }

[libraries]
spring-webflux = { group = "org.springframework.boot", name = "spring-boot-starter-webflux", version.ref = "spring-boot-version" }
spring-web = { group = "org.springframework.boot", name = "spring-boot-starter-web", version.ref = "spring-boot-version" }
  1. 根项目settings直接引用该文件:
// settings.gradle.kts
dependencyResolutionManagement {
    versionCatalogs {
        create("libs") {
            from(files("gradle/libs.versions.toml"))
        }
    }
}
  1. 若需保留issuing-commons-dependency作为catalog维护入口,让该模块读取根目录的toml文件:
// issuing-commons-dependency/build.gradle.kts
plugins {
    `version-catalog`
    `maven-publish`
}

catalog {
    versionCatalog {
        from(files("../gradle/libs.versions.toml")) // 读取根目录的toml文件
    }
}

// 发布配置可保留,用于对外发布catalog

方案三:复合构建(开发阶段快速迭代)

通过复合构建关联catalog模块,无需手动发布即可使用:

// settings.gradle.kts
includeBuild("issuing-commons-dependency") {
    dependencySubstitution {
        substitute(module("com.yourgroup:issuing-commons-dependency")).using(project(":"))
    }
}

dependencyResolutionManagement {
    repositories {
        mavenCentral()
    }
    versionCatalogs {
        create("libs") {
            from("com.yourgroup:issuing-commons-dependency:1.0.0")
        }
    }
}

Gradle会自动关联issuing-commons-dependency模块,修改catalog后无需重新发布即可生效。

注意事项

  • 方案一和三需要确保issuing-commons-dependency的group和version配置正确,否则会出现依赖解析失败。
  • Gradle 7.x版本对跨模块version catalog的直接引用支持有限,方案二是最稳定且无额外构建步骤的方式。

内容的提问来源于stack exchange,提问作者Max Hunter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:12:45