在 Java 之前编译 Scala/与 Gradle 一起编译

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


答案 1

Java和Scala可以在scala源代码中组合,以将它们联合编译,例如

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

答案 2

如果你的java代码使用一些外部库,比如Lombok,使用scala编译器构建java类将失败,因为scala编译器不知道注释。

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

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

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

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

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

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

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

推荐