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
相关产品推荐
相关产品推荐

