如何在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
相关产品推荐
相关产品推荐

