IntelliJ IDEA में SBT का उपयोग करके Uber JAR (फैट JAR) का निर्माण कैसे करें?


92

मैं एक सरल स्काला प्रोजेक्ट बनाने के लिए SBT (IntelliJ IDEA के भीतर) का उपयोग कर रहा हूं।

मैं जानना चाहूंगा कि Uber JAR फ़ाइल (उर्फ फैट जार, सुपर जार) बनाने का सबसे सरल तरीका क्या है ।

मैं वर्तमान में SBT का उपयोग कर रहा हूं, लेकिन जब मैं अपनी JAR फाइल को Apache Spark में सबमिट कर रहा हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

थ्रेड में अपवाद "मुख्य" java.lang.SecurityException: अमान्य हस्ताक्षर फ़ाइल मैनिफ़ेस्ट मुख्य विशेषताओं के लिए पचती है

या संकलन समय के दौरान यह त्रुटि:

java.lang.RuntimeException: deduplicate: निम्नलिखित में पाई जाने वाली विभिन्न फ़ाइल सामग्री:
PATH \ DEPENDENCY.jar: META-INF / DEPENDENCIES
PATH \ DEPENDENCY.jar: META-INF / MANIFEST.MF

ऐसा लगता है कि ऐसा इसलिए है क्योंकि मेरे कुछ आश्रितों में सिग्नेचर फाइल्स (META-INF) शामिल हैं जिन्हें अंतिम उबेर आरएआर फाइल में निकालने की जरूरत है।

मैंने उस तरह sbt- असेंबली प्लगइन का उपयोग करने की कोशिश की :

/project/assembly.sbt

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

/project/plugins.sbt

logLevel := Level.Warn

/build.sbt

lazy val commonSettings = Seq(
  name := "Spark-Test"
  version := "1.0"
  scalaVersion := "2.11.4"
)

lazy val app = (project in file("app")).
  settings(commonSettings: _*).
  settings(
    libraryDependencies ++= Seq(
      "org.apache.spark" %% "spark-core" % "1.2.0",
      "org.apache.spark" %% "spark-streaming" % "1.2.0",
      "org.apache.spark" % "spark-streaming-twitter_2.10" % "1.2.0"
    )
  )

जब मैं IntelliJ IDEA में " बिल्ड आर्टवर्क ... " पर क्लिक करता हूं तो मुझे एक JAR फाइल मिलती है। लेकिन मैं उसी त्रुटि के साथ समाप्त होता हूं ...

मैं एसबीटी के लिए नया हूं और इंटेलीज आईडीई के साथ बहुत प्रयोग नहीं किया गया है।

धन्यवाद।


2
चीजों की आवाज़ से आपको META-INFफ़ाइलों को फ़िल्टर करने की आवश्यकता हो सकती है - एक ब्लॉग पोस्ट जो मदद कर सकती है: janschulte.wordpress.com/2014/03/20/…
शॉन विएरा

जवाबों:


147

अंत में मैं अपनी वैश्विक समझ में शोर उत्पन्न करने से बचने के लिए IntelliJ IDEA का उपयोग पूरी तरह से छोड़ देता हूं :)

मैंने आधिकारिक एसबीटी ट्यूटोरियल पढ़ना शुरू किया ।

मैंने निम्न फ़ाइल संरचना के साथ अपना प्रोजेक्ट बनाया:

my-project/project/assembly.sbt
my-project/src/main/scala/myPackage/MyMainObject.scala
my-project/build.sbt

मेरी असेंबली में sbt- असेंबली प्लगइन जोड़ा। sbt फ़ाइल एक मोटी जार बनाने के लिए मुझे अनुमति देना:

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

मेरा न्यूनतम बिल्ड.sbt ऐसा दिखता है:

lazy val root = (project in file(".")).
  settings(
    name := "my-project",
    version := "1.0",
    scalaVersion := "2.11.4",
    mainClass in Compile := Some("myPackage.MyMainObject")        
  )

val sparkVersion = "1.2.0"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % sparkVersion % "provided",
  "org.apache.spark" %% "spark-streaming" % sparkVersion % "provided",
  "org.apache.spark" %% "spark-streaming-twitter" % sparkVersion
)

// META-INF discarding
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
   {
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard
    case x => MergeStrategy.first
   }
}

नोट : % "provided"अंतिम वसा जार (उन पुस्तकालयों को पहले से ही मेरे कार्यकर्ताओं में शामिल किया गया है) में निर्भरता को शामिल नहीं करने का मतलब

नोट : META-INF इस उत्तरदाता से प्रेरित है

नोट : का अर्थ %और%%

अब मैं अपने / मेरे-प्रोजेक्ट रूट फ़ोल्डर में निम्न कमांड चलाकर SBT ( इसे कैसे स्थापित करें ) का उपयोग करके अपना मोटा JAR बना सकता हूं :

sbt assembly

मेरा मोटा JAR अब नए जनरेट / लक्ष्य फ़ोल्डर में स्थित है :

/my-project/target/scala-2.11/my-project-assembly-1.0.jar

आशा है कि किसी और की मदद करता है।


जो इंटेलीजे आईडीई के भीतर एसबीटी को गले लगाना चाहते हैं, उनके लिए: इंटेलीजे आईडीईए के भीतर से एसबीटी-विधानसभा कार्यों को कैसे चलाना है?


2
Databricks से पर uber-जार से छोड़कर स्पार्क की [समस्या जावा / Maven सुझाव databricks.gitbooks.io/databricks-spark-knowledge-base/content/...
JimLohse


1
पुराने META-INF को छोड़ने का कारण क्या है?
जूल

2
नोट:% "प्रदान किया गया" का अर्थ है अंतिम वसा जार में निर्भरता को शामिल नहीं करना, जिसने मेरी मदद की है!
जयसागर

गंभीरता से आश्चर्य है कि यह एकमात्र प्लगइन उपलब्ध है - आधिकारिक भी नहीं है, और sbt संस्करणों में भी काम नहीं करता है
अभिनंदन दुबे

40

इंटेलीज आइडिया में उबर जार / फैट जार के निर्माण के लिए 3 चरण प्रक्रिया:

Uber JAR / Fat JAR : JAR फ़ाइल में सभी बाहरी लाइब्रेर निर्भरताएँ हैं।

  1. IntelliJ आइडिया में SBT असेंबली प्लगइन जोड़ना

    प्लगइन एसबीटी पथ

    पर जाएं ProjectName / परियोजना / लक्ष्य / plugins.sbt फ़ाइल और इस लाइन को जोड़नेaddSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

  2. Merge, Discard और Do Not Add strategy को build.sbt में जोड़ना

    Sbt पथ बनाएँ

    पर जाएं ProjectName / build.sbt फ़ाइल और एक उबेर जार की पैकेजिंग के लिए रणनीति को जोड़ने

    मर्ज की रणनीति: यदि लाइब्रेरी के एक संस्करण के बारे में दो पैकेजों में विरोधाभास है, तो उबर जार में कौन सा पैक करना है।
    रणनीति त्यागें: लाइब्रेरी से कुछ फाइलें निकालने के लिए जिन्हें आप उबर जार में पैकेज नहीं करना चाहते हैं।
    रणनीति न जोड़ें: उबर जार में कुछ पैकेज न जोड़ें।
    पूर्व के लिए: spark-coreपहले से ही आपके स्पार्क क्लस्टर में मौजूद होगा। इसलिए हमें उबर जार में पैकेज नहीं करना चाहिए

    मर्ज रणनीति और रणनीति को त्यागें मूल कोड:

    assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }

    इसलिए आप इस आदेश का उपयोग करके META-INF फ़ाइलों को छोड़ने के लिए कह रहे हैं MergeStrategy.discardऔर बाकी फ़ाइलों के लिए आप लाइब्रेरी फ़ाइल की पहली घटना ले रहे हैं यदि इस कमांड का उपयोग करके कोई विरोध हैMergeStrategy.first

    रणनीति मूल कोड न जोड़ें:

    libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.1" %"provided"

    यदि हम अपनी Uber JAR फ़ाइल में स्पार्क-कोर नहीं जोड़ना चाहते हैं क्योंकि यह हमारे क्लिटर पर पहले से ही मौजूद है, इसलिए हम % "provided"इसे लाइब्रेरी की निर्भरता के अंत में जोड़ रहे हैं ।

  3. अपने सभी आश्रितों के साथ उबर जार का निर्माण

    sbtassembly

    sbt assemblyपैकेज बनाने के लिए टर्मिनल प्रकार में


देखा !!! उबर जार निर्मित है। JAR ProjectName / target / scala-XX में होगा

JarBuilt


16

अपने प्रोजेक्ट / plugins.sbt में निम्न पंक्ति जोड़ें

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

अपने build.sbt में निम्नलिखित जोड़ें

mainClass in assembly := some("package.MainClass")
assemblyJarName := "desired_jar_name_after_assembly.jar"

val meta = """META.INF(.)*""".r
assemblyMergeStrategy in assembly := {
  case PathList("javax", "servlet", xs @ _*) => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".html" => MergeStrategy.first
  case n if n.startsWith("reference.conf") => MergeStrategy.concat
  case n if n.endsWith(".conf") => MergeStrategy.concat
  case meta(_) => MergeStrategy.discard
  case x => MergeStrategy.first
}

फैट जार बनाते समय होने वाले संघर्षों को हल करने के लिए असेंबली मर्ज की रणनीति का उपयोग किया जाता है।


1
आप कंसोल में "एसबीटी असेंबली" चलाकर मोटा जार बना सकते हैं
एआरएमवी

2
स्केला संस्करण 2.11.8 (एसबीटी संस्करण: 0.13.12) के लिए डाल दिया addSbtPlugin ( "com.eed3si9n"% "एसबीटी-विधानसभा"% "0.12.0") परियोजना / assembly.sbt में
ARMV
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.