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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:24:04