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

如何在单独Gradle Kotlin DSL脚本中正确配置maven-publish

Groovy 与 Gradle Kotlin DSL 配置的核心差异
  • 类型安全机制不同:Groovy 是动态类型,publishing {} 这类配置块是运行时动态解析的,只要插件应用成功就可以直接调用,不需要提前声明类型。而 Kotlin DSL 是静态类型,所有配置块的访问都需要编译器能识别对应接收器类型,单独的脚本文件如果没有提前绑定项目扩展的类型,就会找不到对应的配置函数。
  • 插件应用后的扩展可见性:Groovy 脚本中执行apply plugin: 'maven-publish'之后,项目会自动注入publishing扩展的动态方法,直接写配置块就能识别。Kotlin DSL 中如果是单独的脚本(不是约定插件、也没有导入对应扩展类),直接写publishing {}会被编译器优先识别为PluginDependenciesSpec下的publishing属性(就是 plugins 块里用来声明插件的那个属性),而不是项目的发布扩展配置,所以会抛出类型不匹配的错误。
  • 脚本导入的解析逻辑:Groovy 的apply from:导入脚本时,所有配置都是动态合并到目标项目的,没有严格的类型校验。Kotlin DSL 导入外部脚本时,默认不会提前加载插件对应的类型扩展,需要显式声明扩展的接收类型,或者用约定插件的方式处理。
单独 Kotlin DSL 脚本的正确配置方案

方案1:独立脚本显式获取 publishing 扩展

把你的publish.gradle重命名为publish.gradle.kts,内容修改为如下格式:

// 先应用 maven-publish 插件
apply(plugin = "maven-publish")

// 显式指定扩展类型获取配置,避免编译器识别错误
configure<PublishingExtension> {
    publications {
        // 此处编写原有发布配置逻辑,示例如下
        create<MavenPublication>("maven") {
            from(components["java"])
            // 读取模块提前定义的发布属性
            groupId = project.property("publish.groupId").toString()
            artifactId = project.property("publish.artifactId").toString()
            version = project.property("publish.version").toString()
        }
    }
    repositories {
        // 配置发布仓库地址,示例如下
        maven {
            url = uri("你的私服地址")
            credentials {
                username = project.property("maven.username").toString()
                password = project.property("maven.password").toString()
            }
        }
    }
}

模块的build.gradle.kts保持原有导入逻辑即可:

// 模块提前定义发布需要的属性
extra["publish.groupId"] = "com.example"
extra["publish.artifactId"] = "demo-module"
extra["publish.version"] = "1.0.0"

apply(from = rootProject.file("publish.gradle.kts"))

方案2:使用预编译脚本插件(多模块项目更推荐)

如果项目模块数量多,更推荐这种方案,有完整的代码提示,编译期即可检查配置错误:

  1. 在项目根目录创建buildSrc/src/main/kotlin目录
  2. 在该目录下创建publish-conventions.gradle.kts文件,内容如下:
plugins {
    `maven-publish`
}

// 预编译脚本会自动识别插件扩展,可直接写 publishing 配置块
publishing {
    publications {
        create<MavenPublication>("maven") {
            from(components["java"])
            groupId = project.extra["publish.groupId"].toString()
            artifactId = project.extra["publish.artifactId"].toString()
            version = project.extra["publish.version"].toString()
        }
    }
}
  1. 模块的build.gradle.kts直接引入该约定插件即可:
plugins {
    `java-library`
    id("publish-conventions")
}

// 定义模块的发布属性
extra["publish.groupId"] = "com.example"
extra["publish.artifactId"] = "demo-module"
extra["publish.version"] = "1.0.0"

内容的提问来源于stack exchange,提问作者Mahdi-Malv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:54:04