Varsayılan scala eklentisi görev akışı Java'yı Scala'dan önce derler, böylece Java içindeki Scala kaynaklarını içe aktarır "hata: sembolü bulamıyor". Java'yı Gravel ile birlikte/yanında derleme Scala
12
A
cevap
21
Ben sorunu çözmek için aşağıdaki sourceSet yapılandırma bulundu:
sourceSets {
main {
scala {
srcDirs = ['src/main/scala', 'src/main/java']
}
java {
srcDirs = []
}
}
Bu scala kaynak seti java ve skala kaynaklarını ikisini içerebilir çünkü.
0
Eğer java kodunuz Lombok gibi bazı dış kütüphaneleri kullanıyorsa, scala derleyicisi ek açıklamaları bilmediğinden java sınıfı oluşturmak için scala derleyicisini kullanamaz.
Çözümüm, görev bağımlılıklarını değiştirmek, Java'dan önce Scala derlemeyi yapmaktır.
tasks.compileJava.dependsOn compileScala
tasks.compileScala.dependsOn.remove("compileJava")
Şimdi görev
compileScala
çalışır
compileJava
önce, o kadar. java kodu scala koduna bağlıdır Eğer
, sen
scala ve java çıkış klasörü Ayrı,
sourceSets { main { scala { outputDir = file("$buildDir/classes/scala/main") } java { outputDir = file("$buildDir/classes/java/main") } }
olarak scala çıkışını ekle, daha iki adım yapmanız gereken
compileJava
için bağımlılık,dependencies { compile files("$sourceSets.main.scala.outputDir") }
Java ve Scala kaynaklarını ayrı dizinlerde tutmak ve tüm kodların birlikte derlenmesini istiyorsanız, bu doğru çözümdür. Bir alternatif, varsayılan kurulumu korumak ve 'src/main/scala' ve geri kalan Java kodunu (eğer varsa) 'src/main/java'ya derlenecek bir Java kodu koymaktır. –
Teşekkürler. CompileScala ile derlenen Java kodunun compileJava ile derlendiğinden farklı davranıp davranmayacağını merak ediyoruz. Aynı derleyiciyi kullandıklarını, dolayısıyla da aynı bayt kodunu üreteceklerini, ancak scala kaynağına bağlanmaya izin verdiklerini varsayıyoruz. Bu doğru mu? – crizCraig
Ortak derleme, bu durumda Java derleyicisini çağırmaktan sorumlu olan Scala derleyici tarafından kontrol edilir. Sonuç genellikle aynı olmalıdır. Ortak derlenmiş Java kodunun Java derleme seçeneklerini etkilemek için "compileJava.options" yerine "compileScala.options" öğesini yapılandırmanız gerekeceğini unutmayın. (Scala derleme seçenekleri 'compileScala.scalaCompileOptions' üzerinden kontrol edilir.) Bu tür bir yapılandırmayı muhtemelen tüm derleme görevlerine uygulamak isteyebilirsiniz (ör.' Tasks.withType (ScalaCompile) {options ...} '). –