2012-03-19 12 views
6

मुझे एसबीटी प्रोजेक्ट बनाने और चलाने में समस्याएं आ रही हैं।स्कैला एसबीटी मल्टी मॉड्यूल प्रोजेक्ट रनने योग्य जार

  • "प्रोटोकॉल" प्रोजेक्ट का उपयोग कई मॉड्यूल द्वारा किया जाता है, जिसमें "डेमन" भी शामिल है।

  • "डेमन" परियोजना निष्पादन योग्य जार के रूप में पैक की जानी चाहिए।

ऐसा करने का "सही" तरीका क्या है?

यहाँ मेरी Build.scala है:

object MyBuild extends Build { 
lazy val buildSettings = Seq(
    organization := "com.example", 
    version  := "1.0-SNAPSHOT", 
    scalaVersion := "2.9.1" 
    ) 

lazy val root = Project(
    id = "MyProject", 
    base = file("."), 
    aggregate = Seq(protocol, daemon) 
    ) 

lazy val protocol = Project(
    id = "Protocol", 
    base = file("Protocol") 
    ) 

lazy val daemon = Project(
    id = "Daemon", 
    base = file("Daemon"), 
    dependencies = Seq(protocol) 
    ) 
// (plus more projects) 

उत्तर

7

यह करने के लिए सही तरीके से जार के उत्पादन के लिए एसबीटी प्लगइन्स से एक का उपयोग करने के लिए है। मैंने one-jar और assembly दोनों का परीक्षण किया है और दोनों को आपके जार से पुस्तकालयों को छोड़ने के लिए समर्थन है। आप व्यक्तिगत परियोजनाओं में सेटिंग्स जोड़ सकते हैं ताकि उनमें से कुछ केवल जार का उत्पादन करेंगे।

मैं व्यक्तिगत रूप से असेंबली का उपयोग कर रहा हूं, लेकिन this post अंक के रूप में, यदि आप फ़ाइल नाम ओवरलैप कर रहे हैं तो आप समस्याओं में भाग लेंगे।

संपादित करें:

अपने उपरोक्त उदाहरण आप शीर्ष पर निम्न आयात जोड़ना होगा के लिए:

import sbtassembly.Plugin._ 
import AssemblyKeys._ 

आप प्रोजेक्ट को संशोधित हैं, तो इस तरह देखने के लिए:

lazy val daemon = Project(
    id = "Daemon", 
    base = file("Daemon"), 
    dependencies = Seq(protocol), 
    settings = assemblySettings 
) 

इसके अलावा आपको निम्नलिखित project/plugins.sbt (एसबीटी 1111 के लिए) जोड़ने की आवश्यकता है:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.7.3") 

resolvers += Resolver.url("sbt-plugin-releases", 
    new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns) 

यदि आप असेंबली के साथ जाने का निर्णय लेते हैं तो आपको शायद डुप्लिकेट फ़ाइलों को हटाने की आवश्यकता होगी। "ProjectName" नामक प्रोजेक्ट में डुप्लिकेट log4j.properties फ़ाइलों को छोड़कर असेंबली कोड का एक उदाहरण यहां दिया गया है। इसे परियोजना के लिए "सेटिंग्स" अनुक्रम के हिस्से के रूप में जोड़ा जाना चाहिए। ध्यान दें कि दूसरा संग्रह विवरण मूल कार्यान्वयन है और इसकी आवश्यकता है।

excludedFiles in assembly := { (bases: Seq[File]) => 
    bases.filterNot(_.getAbsolutePath.contains("projectName")) flatMap { base => 
    //Exclude all log4j.properties from other peoples jars 
    ((base * "*").get collect { 
     case f if f.getName.toLowerCase == "log4j.properties" => f 
    }) ++ 
    //Exclude the license and manifest from the exploded jars 
    ((base/"META-INF" * "*").get collect { 
     case f if f.getName.toLowerCase == "license" => f 
     case f if f.getName.toLowerCase == "manifest.mf" => f 
    }) 
    } 
} 
+0

धन्यवाद, यह ठीक काम करता है। प्लगइन को मेरे plugins.sbt में भी जोड़ना था - आप दूसरों को भी मदद करने के लिए अपने उत्तर में जोड़ सकते थे। मैं कल सवाल बंद कर दूंगा। ऐसा लगता है कि मुझे केवल एक चीज की आवश्यकता है जिसे सेटिंग मुख्य क्लास: = कुछ ("com.example.Main") को मेरे प्रोजेक्ट में जोड़ना था, जब तक मैं निर्भरता/क्लासपाथ का प्रबंधन करता हूं। - यह दस्तावेज़ीकरण में काफी छिपी हुई थी, या शायद मैं सिर्फ अंधेरा हूं :-) – Arve

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