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

如何在Scala与Java混合开发项目中编译JDK 16的Java Record类型

可行解决方法如下:
  • 调整编译配置,拆分Java和Scala的编译流程
    你当前的配置将Java源码全部交给Scala编译器处理,是触发语法识别报错的核心原因。修改Gradle配置为Java编译器先编译Java源码,Scala编译器仅处理Scala源码并依赖Java编译结果,配置示例如下:
// 移除原来把Java源码交给Scala编译的配置,改为如下配置
sourceSets {
    main {
        java {
            srcDirs = ['src/main/java']
        }
        scala {
            srcDirs = ['src/main/scala']
        }
    }
}

// 配置Scala编译依赖Java编译结果
compileScala {
    classpath += sourceSets.main.java.output
    sourceCompatibility = "16"
    targetCompatibility = "16"
}
// 若Java代码需要依赖Scala代码,添加如下配置
compileJava {
    dependsOn compileScala
    classpath += sourceSets.main.scala.output
}
  • 升级Scala版本到完全支持JDK16语法的版本
    Scala 2.13.6不支持识别Java record语法,需要将Scala版本至少升级到2.13.10及以上,该版本开始Scala编译器正式支持解析JDK 16引入的record语法。
  • 抽离Java record为独立纯Java子模块
    如果暂时无法升级Scala版本,可以将所有用到record的Java代码单独拆分为一个子模块,该子模块仅启用Java插件,无Scala相关编译逻辑,其他混合模块直接依赖该子模块的编译产物即可。该方案下Scala编译器仅需要读取record编译后的class文件,不需要解析Java record源码,不会触发语法报错。
  • 临时替换record为传统POJO
    如果以上方案都暂时无法落地,可以先把需要的Java record改写为等价的传统POJO:定义私有final成员变量、全参构造方法、对应getter方法,重写equals、hashCode、toString方法,功能和record完全一致,后续环境适配后再改回record即可。

内容的提问来源于stack exchange,提问作者NikMashei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 01:18:02