2013-10-06 10 views
53

मेरा स्कैला एप्लिकेशन केवल जावा 7 के साथ चलाएगा क्योंकि यह पुस्तकालयों पर निर्भर करता है जो केवल जेडीके के उस संस्करण में दिखाई देता है।एसबीटी में स्कैला परियोजना के लिए जावा संस्करण लागू करना?

मैं एसबीटी में इसे कैसे लागू कर सकता हूं, ताकि अगर वह एसबीटी को एप्लिकेशन चलाने/संकलित करने के लिए शुरू करते समय सही त्रुटि संदेश उपयोगकर्ता को तुरंत दिखाया जाए तो क्या वह सही है?

नोट: NO जावा ™ स्रोत कोड यहां संकलित करने के लिए है। मैं केवल स्कैला स्रोत कोड है। स्कैला कोड को import java.nio.file.Path की आवश्यकता है जो जावा 7 से उपलब्ध है।

उत्तर

3

जावा 7 में संकलित करने के लिए, आपको स्रोत 1.7 के साथ संकलित करने के लिए जावैक विकल्प जोड़ना चाहिए।

आपको अपने एसबीटी बिल्ड कॉन्फ़िगरेशन में javacOptions ++= Seq("-source", "1.7") जोड़ना चाहिए जो/प्रोजेक्ट फ़ोल्डर में पाया जा सकता है।

यहाँ एसबीटी से संदर्भ दिया गया है: http://www.scala-sbt.org/release/docs/Detailed-Topics/Java-Sources.html

+0

ठीक है, अगर कोई 1.6 त्रुटि संदेशों पर यह कोड चलाएगा [बहुत व्यापक नहीं होगा] (http://stackoverflow.com/q/10382929/298389)। –

+4

एसबीटी का वह अनुभाग "जावा स्रोतों को संकलित करने के लिए समर्थन" से संबंधित है, लेकिन जिसके लिए जावा वीएम का उपयोग स्कैला द्वारा किया जाता है। वर्तमान में मैं अपने स्कैला प्रोजेक्ट में किसी भी जावा स्रोत को संकलित नहीं कर रहा हूं, मैं सिर्फ उन पुस्तकालयों का उपयोग कर रहा हूं जो jdk6 में उपलब्ध नहीं हैं, और केवल jdk7 –

19

होने के नाते स्काला कोड, आप का निर्माण परिभाषा दावे डाल सकते हैं। sbt इस तरह की चीजों के लिए initialize को एक सामान्य स्थान के रूप में परिभाषित करता है, लेकिन आप कस्टम सेटिंग सहित किसी भी सेटिंग का उपयोग कर सकते हैं। उदाहरण के लिए,

initialize := { 
    val _ = initialize.value // run the previous initialization 
    val classVersion = sys.props("java.class.version") 
    val specVersion = sys.props("java.specification.version") 
    assert(..., "Java N or above required") 
} 
+0

में उपलब्ध हैं, यह समझ में आता है।हालांकि मुझे दूसरा हिस्सा याद आ रहा है: मैं कैसे चुन सकता हूं कि जेडीके एसबीटी का उपयोग करता है? (किसी भी तरह मेरा एसबीटी जावा 7 का उपयोग करने पर जोर देता है, जबकि मुझे जावा 8 पुस्तकालयों की आवश्यकता है)। – Suma

41

javacOptions ++= Seq("-source", "1.7", "-target", "1.7") का उपयोग कर काम नहीं करता है यदि आपके पास जावा स्रोत नहीं हैं।

लेकिन आप build.sbt या Build.scala में स्काला संकलक के लिए लक्ष्य JVM सेट कर सकते हैं:

$ sbt clean run 
[info] Set current project to default-cd5534 (in build file:/tmp/so/) 
[success] Total time: 0 s, completed 27.10.2013 14:31:43 
[info] Updating {file:/tmp/so/}default-cd5534... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Compiling 1 Scala source to /tmp/so/target/scala-2.10/classes... 
[info] Running Main 
[error] (run-main) java.lang.UnsupportedClassVersionError: Main : Unsupported major.minor version 51.0 
java.lang.UnsupportedClassVersionError: Main : Unsupported major.minor version 51.0 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:634) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:277) 
     at java.net.URLClassLoader.access$000(URLClassLoader.java:73) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:212) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:314) 
[trace] Stack trace suppressed: run last compile:run for the full output. 
java.lang.RuntimeException: Nonzero exit code: 1 
     at scala.sys.package$.error(package.scala:27) 
[trace] Stack trace suppressed: run last compile:run for the full output. 
[error] (compile:run) Nonzero exit code: 1 
[error] Total time: 4 s, completed 27.10.2013 14:31:47 

नोट:

scalacOptions += "-target:jvm-1.7" 

एक परिणाम यह एक JDK 6 पर प्रिंट के रूप में: शायद यह केवल नवीनतम एसबीटी/स्केलेक संस्करण के लिए काम करता है।

10

एसबीटी 0.13.6 में एक नया VersionNumber वर्ग और VersionNumberCompatibility विशेषता है। दृष्टिकोण @MarkHarrah द्वारा सिफारिश की इस एक का उपयोग करने के लिए निम्न कार्य कर सकते हैं ट्वीक:

initialize := { 
    val _ = initialize.value // run the previous initialization 
    val required = VersionNumber("1.8") 
    val curr = VersionNumber(sys.props("java.specification.version")) 
    assert(CompatibleJavaVersion(curr, required), s"Java $required or above required") 
} 

... 
/** Java specification version compatibility rule. */ 
object CompatibleJavaVersion extends VersionNumberCompatibility { 
    def name = "Java specification compatibility" 
    def isCompatible(current: VersionNumber, required: VersionNumber) = 
     current.numbers.zip(required.numbers).foldRight(required.numbers.size<=current.‌​numbers.size)((a,b) => (a._1 > a._2) || (a._1==a._2 && b)) 
    def apply(current: VersionNumber, required: VersionNumber) = isCompatible(current, required) 
} 
+2

यदि यह कभी जावा '2.0' है तो यह' संगत 'परिभाषा गलत बात करती है। आप जो चाहते हैं वह है 'current.numbers.zip (required.numbers) .foldRight (required.numbers.size <= current.numbers.size) ((ए, बी) => (a._1> a._2) || (ए ._1 == ए._2 और बी)) ' –

+0

बहुत धन्यवाद @ डैनियल मार्टिन। आपके फिक्स के साथ अपडेट किया गया। – metasim

15

भविष्य में किसी के लिए, यह भी यह करने के लिए एक अच्छा तरीका है। यह निष्पादन तुरंत रुकती है, तो यह सही जावा संस्करण नहीं मिल सकता है:

initialize := { 
    val _ = initialize.value // run the previous initialization 
    val required = "1.8" 
    val current = sys.props("java.specification.version") 
    assert(current == required, s"Unsupported JDK: java.specification.version $current != $required") 
} 

अपने build.sbt में आप इस डाल दिया।

+4

पिछले 'प्रारंभिक मान' को कॉल करना बुद्धिमान होगा। –

+1

यह फ़ाइल किस में है ?? – Jus12

+0

इसमें कौन सी फाइल है ??? – pathikrit

1

बस में दर-मामला यदि आप ग्रहण स्केला-आईडीई परिवर्तन सेटिंग्स आधारित उपयोग में

खिड़की -> वरी - स्केला संकलक -> मानक -> लक्ष्य -> ​​JVM-1,7

enter image description here

संबंधित मुद्दे