我有一个 gradle 4.1 多项目,其中包含一个“projectA”,其中包含 2 个子文件夹“api”和“implementation”。
多项目使用主 build.gradle 的子项目部分中定义的 kotlin
和 java-library
插件。
实现项目具有对 :projectA:api
在 api 文件夹中,“src/main/java”内有 kotlin 和 java 文件,在实现项目中,我正在从 API 创建 kotlin 类的新实例。
在 Intellij Idea 中,我没有任何编译错误;但是当我使用 gradle 编译整个项目时,出现错误:找不到符号。就好像 compileJava
无法访问文件夹 kotlin-classes
。
在 build/kotlin-classes
中,我看到了我的 file.class
类文件也位于 build/classes 目录中
错误详细信息:
Task :projectA:api:compileKotlin Using kotlin incremental compilation
Task :projectA:implementation:compileJava (...) error: cannot find symbol (the import fails)
更新 1:删除 java-library 解决了我的问题
最佳答案
这是一个known issue java-library 插件的:当在使用其他 JVM 语言(Kotlin、Scala、Groovy 等)的项目中使用时,它不会注册其他语言的类,以便依赖项目获取它们当他们消耗类(class)时。
幸运的是,它也有一个解决方法。适应 Kotlin,它看起来像:
configurations {
apiElements {
outgoing.variants.getByName('classes').artifact(
file: compileKotlin.destinationDir,
type: ArtifactTypeDefinition.JVM_CLASS_DIRECTORY,
builtBy: compileKotlin)
}
}
如果您使用 Kapt1,则为 file:compileKotlinAfterJava.destinationDir
,对于低于 4.0 的 Gradle 版本,请使用 builtBy: copyMainKotlinClasses
。
此问题也在 Kotlin 问题跟踪器中进行跟踪:KT-18497 ,按照该问题查看 Kotlin Gradle 插件端何时修复该问题,这样就不再需要上述解决方法了。
关于gradle 无法使用 kotlin 类编译 java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45762661/