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

Kotlin多模块Gradle项目依赖配置问题求助

解决Kotlin Gradle项目模块依赖的仓库同步与插件冲突问题

我有如下结构的Kotlin Gradle项目:

┌Top Kotlin Project  
│  
├── Project1   
│    │
│    ├── ModuleA1 (依赖C1)
│    ├── ModuleA2
│    ├── ModuleA3
│    └── settings.gradle
├── ModuleB1 (依赖C1)
├── ModuleC1 (库模块)
└── settings.gradle

ModuleA1、A2、A3、B1是独立应用模块,ModuleC1是共享库。原本用implementation(project(":ModuleC1"))依赖,但遇到两个问题:

  1. 所有依赖C1的模块都要配置C1的依赖仓库,C1变更时需同步修改多个构建文件;
  2. Kotlin插件版本冲突:C1和依赖它的模块都声明插件时出现Plugin request for plugin already on the classpath must not include a version错误,去掉C1的插件声明则C1无法单独构建。

希望找到方案:既能独立开发ModuleC1,又能让其他模块像使用普通第三方包一样依赖它。


最优方案:将ModuleC1发布到本地Maven仓库

通过把C1发布到本地Maven仓库,其他模块直接用Maven坐标依赖,彻底解决依赖同步和插件冲突问题。

1. 配置ModuleC1支持发布到本地Maven

修改ModuleC1的build.gradle.kts,添加maven-publish插件并配置发布规则:

plugins {
    kotlin("jvm") version "1.6.20"
    `java-library`
    `maven-publish` // 新增发布插件
}

group = "org.test.project"
version = "0.1"

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1")
}

tasks.getByName<Test>("test") {
    useJUnitPlatform()
}

// 配置发布到本地Maven仓库
publishing {
    publications {
        create<MavenPublication>("maven") {
            from(components["java"])
        }
    }
}

执行./gradlew publishToMavenLocal即可将C1发布到本地Maven仓库(默认路径:~/.m2/repository)。

2. 统一管理插件版本解决冲突

在顶层项目和Project1的settings.gradle.kts中添加pluginManagement,统一所有模块的插件版本,避免版本冲突:

顶层项目settings.gradle.kts:

pluginManagement {
    plugins {
        kotlin("jvm") version "1.6.20"
        `java-library`
        `maven-publish`
    }
    repositories {
        gradlePluginPortal()
        mavenCentral()
    }
}

include(":ModuleB1", ":ModuleC1")

Project1的settings.gradle.kts:

pluginManagement {
    plugins {
        kotlin("jvm") version "1.6.20"
        `java-library`
    }
    repositories {
        gradlePluginPortal()
        mavenCentral()
    }
}

include(":ModuleA1", ":ModuleA2", ":ModuleA3")

之后所有模块的plugins块中无需再指定插件版本,直接引用即可:

plugins {
    kotlin("jvm")
    application // 应用模块添加这个
}

3. 修改依赖模块的引用方式

在ModuleA1和ModuleB1的build.gradle.kts中,替换项目依赖为Maven坐标,并添加本地Maven仓库:

plugins {
    kotlin("jvm")
    application
}

repositories {
    mavenCentral()
    mavenLocal() // 新增本地Maven仓库
}

dependencies {
    // 替换project依赖为Maven坐标
    implementation("org.test.project:ModuleC1:0.1")
    // 其他业务依赖...
}

application {
    mainClass.set("你的主类全路径")
}

使用流程

  • 独立开发ModuleC1时,修改代码后执行./gradlew publishToMavenLocal,将最新版本发布到本地仓库;
  • 依赖模块构建时,会自动从本地Maven仓库拉取C1的最新版本,无需同步修改构建文件;
  • 开发阶段可以将C1的版本改为0.1-SNAPSHOT,这样每次发布都会覆盖快照版本,无需频繁修改版本号,执行./gradlew --refresh-dependencies即可更新依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:57:27