使用Gradle在Java之前/之后编译Scala

默认的scala插件任务流在Scala之前编译Java,因此在Java中导入Scala源会导致“error:找不到符号”。 scala任务流程

我找到了以下sourceSet配置来解决问题:

sourceSets { main { scala { srcDirs = ['src/main/scala', 'src/main/java'] } java { srcDirs = [] } } 

这是因为scala源集可以包含java和scala源。

如果你的java代码使用像Lombok这样的外部库,那么使用scala编译器构建java类会失败,因为scala编译器不知道注释。

我的解决方案是更改任务依赖关系,在Java之前编译Scala。

 tasks.compileJava.dependsOn compileScala tasks.compileScala.dependsOn.remove("compileJava") 

现在任务compileScalacompileJava之前compileJava ,就是这样。

如果你的java代码依赖于scala代码,你需要再做两个步骤,

  1. 分离scala和java的输出文件夹,

     sourceSets { main { scala { outputDir = file("$buildDir/classes/scala/main") } java { outputDir = file("$buildDir/classes/java/main") } } 
  2. 添加scala输出作为compileJava的依赖compileJava

     dependencies { compile files("$sourceSets.main.scala.outputDir") }