2014-04-24 37 views

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ü.

+4

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. –

+0

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

+1

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 ...} '). –

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

  1. scala ve java çıkış klasörü Ayrı,

    sourceSets { 
        main { 
         scala { 
          outputDir = file("$buildDir/classes/scala/main") 
         } 
         java { 
          outputDir = file("$buildDir/classes/java/main") 
         } 
        } 
    
  2. 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") 
    }