使用Gradle在Java之前/之后编译Scala
默认的scala插件任务流在Scala之前编译Java,因此在Java中导入Scala源会导致“error:找不到符号”。
我找到了以下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")
现在任务compileScala
在compileJava
之前compileJava
,就是这样。
如果你的java代码依赖于scala代码,你需要再做两个步骤,
-
分离scala和java的输出文件夹,
sourceSets { main { scala { outputDir = file("$buildDir/classes/scala/main") } java { outputDir = file("$buildDir/classes/java/main") } }
-
添加scala输出作为
compileJava
的依赖compileJava
,dependencies { compile files("$sourceSets.main.scala.outputDir") }