Kotlin能否使用多个通用库?Gradle多模块编译报错求助
解决Gradle多模块构建错误 & 多通用库使用问题
一、编译错误的原因及修复方案
你遇到的module3找不到module2类的问题,核心是依赖配置不符合Kotlin多模块(尤其是Kotlin Multiplatform)的规范,具体问题和修复步骤如下:
1. 修正module2的依赖配置
你在module2里使用的compile project(':module1')是Gradle已废弃的旧配置,对于Kotlin通用模块(common module),需要用api或implementation声明依赖,才能确保依赖模块的类能被上层模块访问到:
// module2的build.gradle(Groovy语法) dependencies { // api会将module1的类暴露给依赖module2的模块(比如module3),implementation则仅在module2内部可见 api project(':module1') }
2. 修正module3的依赖配置
expectedBy是Kotlin Multiplatform中用来关联expect/actual声明的专用配置,但它不能替代常规的依赖引入。根据module3的类型,需要补充对应的依赖配置:
- 如果module3是KMP项目的JVM target:
kotlin { jvm { expectedBy project(':module2') dependencies { // 添加实际依赖,确保编译时能找到module2的类 implementation project(':module2') } } }
- 如果module3是纯JVM模块:
dependencies { // 直接依赖module2的JVM变体,Gradle会自动解析对应产物 implementation project(':module2') }
3. 确认通用模块的配置规范
module1和module2作为通用模块,build.gradle中必须包含KMP的通用源码集配置,确保它们被识别为Kotlin多平台通用模块:
kotlin { sourceSets { val commonMain by getting { dependencies { // 这里添加通用依赖(如kotlin-stdlib-common) } } } }
二、关于Kotlin使用多个通用库的问题
当然可以!Kotlin完全支持使用多个通用库(无论是自研的多模块还是第三方通用库),只要注意以下几点:
- 通用模块之间用
api/implementation正确声明依赖,控制依赖的可见性 - 平台模块(如JVM、iOS)通过
expectedBy关联通用模块的同时,补充常规依赖确保编译通过 - 多个通用模块可以互相依赖形成链状结构,只要避免循环依赖即可
比如你可以同时维护moduleA、moduleB两个通用模块,让moduleB依赖moduleA,再让JVM模块同时依赖这两个通用模块,完全不会有问题。
内容的提问来源于stack exchange,提问作者kurt
相关产品推荐
相关产品推荐

