Gradle Kotlin多模块项目中versionCatalog插件使用问题
解决方案:Gradle多模块项目内部复用Version Catalog
问题根源
- Gradle的
dependencyResolutionManagement属于初始化阶段执行逻辑,此时子模块的构建产物尚未生成,无法直接引用:issuing-commons-dependency的catalog。 VersionCatalogsExtension属于根项目dependencyResolutionManagement的上下文,并非子项目的常规扩展,因此无法在子项目中直接获取。
可行方案
方案一:本地发布+本地仓库引用
- 在
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"]) } } }
- 根项目配置依赖解析,引用本地发布的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 } } }
- 执行顺序:先运行
./gradlew :issuing-commons-dependency:publish发布catalog到临时仓库,再执行其他构建命令。
方案二:共享Toml源码文件(最直接)
跳过发布流程,将catalog定义提取为根目录的.toml文件,所有模块直接引用:
- 根目录创建
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" }
- 根项目settings直接引用该文件:
// settings.gradle.kts dependencyResolutionManagement { versionCatalogs { create("libs") { from(files("gradle/libs.versions.toml")) } } }
- 若需保留
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
相关产品推荐
相关产品推荐

