2014-04-24 19 views
12

के साथ जावा के साथ/साथ स्केलिंग संकलन डिफ़ॉल्ट स्कैला प्लगइन कार्य प्रवाह जावा से स्केल स्रोत आयात करने से पहले जावा को संकलित करता है, इसलिए "त्रुटि: प्रतीक नहीं मिल सकता"। scala task flowग्रैडल

उत्तर

21

मैं निम्नलिखित sourceSet config पाया समस्या को ठीक करने के लिए:

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

इसका कारण यह है स्केला स्रोत सेट दोनों जावा और स्केला स्रोतों में शामिल कर सकते हैं।

+4

यदि आप जावा और स्कैला स्रोतों को अलग-अलग निर्देशिकाओं में रखना चाहते हैं और सभी कोड संयुक्त संकलित करना चाहते हैं, तो यह सही समाधान है। एक विकल्प डिफ़ॉल्ट सेटअप को रखना है और जावा कोड को 'src/main/scala', और शेष जावा कोड (यदि कोई है) में' src/main/java' में संकलित किया गया है। –

+0

धन्यवाद। हम सोच रहे हैं कि compileScala के साथ संकलित जावा कोड संकलित जावा के साथ संकलित किए जाने से अलग तरीके से व्यवहार करेगा। हम मानते हैं कि वे एक ही कंपाइलर का उपयोग करते हैं, इस प्रकार नीचे एक ही बाइटकोड उत्पन्न करते हैं, लेकिन स्कैला स्रोत से जोड़ने की अनुमति देते हैं। क्या वो सही है? – crizCraig

+1

संयुक्त संकलन स्कैला कंपाइलर द्वारा नियंत्रित किया जाता है, जो इस मामले में जावा कंपाइलर का आह्वान करने के लिए ज़िम्मेदार है। परिणाम आम तौर पर वही होना चाहिए। ध्यान दें कि संयुक्त संकलित जावा कोड के जावा संकलन विकल्पों को प्रभावित करने के लिए आपको 'compileJava.options' के बजाय' compileScala.options' को कॉन्फ़िगर करना होगा। (स्कैला संकलन विकल्प 'compileScala.scalaCompileOptions' के माध्यम से नियंत्रित होते हैं।) आप शायद सभी संकलन कार्यों (जैसे 'tasks.withType (ScalaCompile) {options ...}') पर ऐसी कोई कॉन्फ़िगरेशन लागू करना चाहते हैं। –

0

यदि आपका जावा कोड जावा क्लास बनाने के लिए स्कैला कंपाइलर का उपयोग करके लंबोक जैसे कुछ बाहरी पुस्तकालयों का उपयोग करता है, तो स्कैला कंपाइलर एनोटेशन नहीं जानता है।

मेरा समाधान कार्य निर्भरताओं को बदलने के लिए है, जावा से पहले स्कैला संकलित करना।

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

अब काम compileScala रन compileJava से पहले, बस इतना ही।

अपने जावा कोड स्केला कोड पर निर्भर करता है, तो आप दो और चरण करने की ज़रूरत है,

  1. अलग स्केला और जावा के आउटपुट फ़ोल्डर,

    sourceSets { 
        main { 
         scala { 
          outputDir = file("$buildDir/classes/scala/main") 
         } 
         java { 
          outputDir = file("$buildDir/classes/java/main") 
         } 
        } 
    
  2. रूप स्केला उत्पादन जोड़े compileJava के लिए एक निर्भरता,

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