Компиляция Scala перед/рядом с Java с Gradle

По умолчанию поток задач с плагином scala компилирует Java до scala, поэтому импорт scala источников внутри Java вызывает "ошибка: не может найти символ". scala task flow

Ответ 1

Я нашел следующую конфигурацию sourceSet, чтобы устранить проблему:

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

Это потому, что исходный набор scala может включать в себя как java, так и scala источники.

Ответ 2

Если ваш Java-код использует некоторые внешние библиотеки, такие как Lombok, использование компилятора scala для сборки java-класса не удастся, так как компилятор scala не знает аннотации.

Мое решение заключается в изменении зависимостей задачи, компиляции scala перед Java.

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

Теперь задача compileScala выполняется до compileJava, что она.

Если ваш код java зависит от кода scala, вам нужно сделать еще два шага,

  • Отделите папку вывода scala и java,

    sourceSets {
        main {
            scala {
                outputDir = file("$buildDir/classes/scala/main")
            }
            java {
                outputDir = file("$buildDir/classes/java/main")
            }
        }
    
  • Добавьте вывод scala в качестве зависимости для compileJava,

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