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

Gradle插件与Android库共享Java/Kotlin代码的实现问题咨询

问题

我希望Gradle插件能依赖一些可同时用于Gradle插件和Android库的通用代码,请问如何在Gradle插件与Android库之间共享纯Java/Kotlin代码?

尝试为Gradle插件添加模块依赖时,出现了“could ':...' could not be found in project”错误,试过includeBuild和include的多种组合都没解决问题。

以下是相关配置示例:

Gradle插件模块配置

plugins {
    `kotlin-dsl`
    `java-gradle-plugin`
    `maven-publish`
}

dependencies {
    // 执行失败
    implementation(project(":Library:Plugin:Shared"))
    //implementation(project(":library:plugin:shared"))
}

Android库模块配置

plugins {
    id("com.android.library")
    id("kotlin-android")
    id("kotlin-parcelize")
    id("maven-publish")
}

android {
    // ...
}

dependencies {
    api(project(":Library:Plugin:Shared"))
}

共享模块配置

repositories {
    mavenCentral()
}

plugins {
    id("org.jetbrains.kotlin.jvm")
    `java-library`
    `maven-publish`
}

dependencies {
}

根目录settings.gradle.kts配置

pluginManagement {
    includeBuild(File("library/plugin/gradle"))
}

include(":Library:Plugin:Shared")
project(":Library:Plugin:Shared").projectDir = file("library/plugin/shared")

include(":Library:Plugin:Gradle")
project(":Library:Plugin:Gradle").projectDir = file("library/plugin/gradle")

补充示例配置

1) root/gradle-plugin/build.gradle.kts

repositories {
    mavenCentral()
}

plugins {
    `kotlin-dsl-base`
    `java-gradle-plugin`
    `maven-publish`
}

dependencies {
    //implementation(":gradle-shared")

    // 以下代码在Gradle插件模块中无法生效,但在其他模块中正常
    implementation(project(":Library:Plugin:Shared")) 
}

gradlePlugin {
    plugins {
        create("changelog-utils") {
            id = "changelog-utils"
            implementationClass = "<path>.ClassLoaderPlugin"
        }
    }
}

2) root/gradle-shared/build.gradle.kts

repositories {
    mavenCentral()
}

plugins {
    `kotlin-dsl-base`
    `java-library`
    //`maven-publish`
}

3) root/settings.gradle.kts

// --------------
// Gradle Plugin
// --------------

includeBuild("gradle-plugin")

// --------------
// Shared Code (Plugin + Library)
// --------------

include(":MyLibrary:Plugin:Shared")
project(":MyLibrary:Plugin:Shared").projectDir = file("gradle-shared")

解决方案

核心前提

共享模块必须是纯JVM模块(不能应用Android插件),这样才能生成通用的JAR包,同时兼容Gradle插件的Kotlin DSL/JVM环境和Android库的编译环境。

具体修复步骤

1. 统一模块ID与路径大小写

Gradle模块ID大小写敏感,确保settings.gradle.kts中声明的模块ID和依赖引用完全一致。比如settings里写:Library:Plugin:Shared,依赖时就不能写成:library:plugin:shared。

2. 修正settings.gradle.kts配置,避免复合构建冲突

includeBuild用于复合构建,会将目标目录作为独立Gradle构建处理,内部模块无法被主构建直接引用。如果Gradle插件模块是主构建的一部分,不要用includeBuild包含它,改用普通include声明:

pluginManagement {
    repositories {
        gradlePluginPortal()
        mavenCentral()
    }
}

// 声明所有模块
include(":Library:Plugin:Shared")
project(":Library:Plugin:Shared").projectDir = file("library/plugin/shared")

include(":Library:Plugin:Gradle")
project(":Library:Plugin:Gradle").projectDir = file("library/plugin/gradle")

// 添加上你的Android库模块声明(如果之前没加)
include(":Library:Android")
project(":Library:Android").projectDir = file("library/android")

3. 确保共享模块插件配置正确

共享模块仅需java-library和kotlin-jvm插件,指定Java/Kotlin版本以保证兼容性:

// 共享模块build.gradle.kts
repositories {
    mavenCentral()
}

plugins {
    id("org.jetbrains.kotlin.jvm") version "1.9.20"
    `java-library`
    `maven-publish` // 可选,需发布模块时启用
}

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

kotlin {
    jvmToolchain(17)
}

4. 正确添加模块依赖

  • Gradle插件模块:
plugins {
    `kotlin-dsl`
    `java-gradle-plugin`
    `maven-publish`
}

repositories {
    mavenCentral()
}

dependencies {
    implementation(project(":Library:Plugin:Shared")) // 与settings中模块ID完全匹配
}

gradlePlugin {
    plugins {
        create("changelog-utils") {
            id = "changelog-utils"
            implementationClass = "com.your.package.ClassLoaderPlugin" // 替换为实际类路径
        }
    }
}
  • Android库模块:
plugins {
    id("com.android.library")
    id("kotlin-android")
    id("kotlin-parcelize")
    `maven-publish`
}

android {
    namespace = "com.your.package.library"
    compileSdk = 34

    defaultConfig {
        minSdk = 24
        targetSdk = 34
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }

    kotlinOptions {
        jvmTarget = "17"
    }
}

dependencies {
    api(project(":Library:Plugin:Shared")) // 同样匹配正确的模块ID
}

5. 错误排查技巧

  • 执行./gradlew projects命令,查看已加载模块列表,确认共享模块和Gradle插件模块都在其中。
  • 检查projectDir指向的文件路径是否存在,比如file("library/plugin/shared")需对应根目录下的真实文件夹。
  • 若必须使用复合构建,需在复合构建的settings中通过dependencySubstitution映射依赖,但优先推荐单构建结构以降低复杂度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:43:18