Gradle Kotlin DSL下Scala-Java多语言项目Java无法调用Scala类如何解决
Gradle Kotlin DSL 下Scala/Java双向调用配置修复方案
问题根因
Gradle默认编译顺序为先编译Java代码,再编译Scala代码,你当前的配置仅将Java源码目录加入了Scala源码集合,但Java编译任务仍会独立优先执行,此时Scala类还未编译生成字节码,因此Java代码引用Scala类时会抛出符号未找到错误。
解决方案
方案1:使用Scala联合编译(推荐)
该方案让Scala编译器同时处理Java和Scala源码,天然支持双向调用,无需额外处理编译顺序,适合没有特殊Java编译参数要求的项目。
将你的build.gradle.kts中的sourceSets配置替换为以下内容:
sourceSets { main { // 清空Java源码目录,避免Java编译任务独立执行 java.setSrcDirs(emptyList<String>()) withConvention(ScalaSourceSet::class) { scala { // Java和Scala源码统一交给Scala编译器处理 setSrcDirs(listOf("src/main/scala", "src/main/java")) } } } test { java.setSrcDirs(emptyList<String>()) withConvention(ScalaSourceSet::class) { scala { setSrcDirs(listOf("src/test/scala", "src/test/java")) } } } } // 可选:显式禁用Java编译任务,避免冗余执行 tasks.named<JavaCompile>("compileJava") { enabled = false }
方案2:调整编译任务执行顺序
如果你的Java代码有独立的编译参数配置,不想让Scala编译器处理Java代码,可以通过调整编译任务依赖顺序实现双向调用:
在build.gradle.kts末尾添加以下配置即可:
// 移除Scala编译对Java编译的默认依赖 tasks.compileScala { dependsOn.removeIf { it == tasks.compileJava.get() } } // 改为Java编译依赖Scala编译,确保Java编译时Scala类已经生成 tasks.compileJava { dependsOn(tasks.compileScala) // 将Scala编译输出的字节码目录加入Java编译的类路径 classpath += files(tasks.compileScala.get().destinationDirectory) }
验证
配置修改完成后,执行./gradlew clean build命令即可完成正常构建,支持Java和Scala类双向调用。
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

