ইন্টেলিজ আইডিইএর মধ্যে এসবিটি ব্যবহার করে একটি উবার জার (ফ্যাট জেআর) কীভাবে তৈরি করবেন?


92

আমি একটি সাধারণ স্কালা প্রকল্প তৈরি করতে এসবিটি (ইন্টেলিজ আইডিইএর মধ্যে) ব্যবহার করছি।

আমি জানতে চাই যে উবার জেআর ফাইল (ওরফে ফ্যাট জেআর, সুপার জেআর) তৈরির সহজ উপায় কী ।

আমি বর্তমানে এসবিটি ব্যবহার করছি তবে আমি যখন আমার জেআর ফাইলটি অ্যাপাচি স্পার্কে জমা দিচ্ছি তখন আমি নিম্নলিখিত ত্রুটিটি পাই:

থ্রেড "মূল" জাভা.লং.সিকিউরিটি এক্সেপশন ব্যতিক্রম: প্রকাশ্য মূল বৈশিষ্ট্যের জন্য অবৈধ স্বাক্ষর ফাইল ডাইজেস্ট

বা সংকলনের সময় এই ত্রুটি:

java.lang.RuntimeException: deduplicate: আলাদা ফাইল বিষয়বস্তু নিম্নলিখিত পাওয়া
পাথ \ DEPENDENCY.jar: মেটা-INF / নির্ভরতা
পাথ \ DEPENDENCY.jar: মেটা-INF / MANIFEST.MF

এটা তোলে দেখে মনে হচ্ছে তার কারণ হল, আমার নির্ভরতা কিছু স্বাক্ষর ফাইল (মেটা-INF) যা চূড়ান্ত উবার JAR- র ফাইলে সরানো প্রয়োজন রয়েছে।

আমি এসবিটি-এসেম্বলি প্লাগইনটি এর মতো ব্যবহার করার চেষ্টা করেছি :

/ প্রোজেক্ট / স্পেস.এসবিটি

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

/ প্রকল্প / প্লাগইনস.এসবিটি

logLevel := Level.Warn

/ বিল্ড.এসবিটি

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"
    )
  )

আমি যখন ইন্টেলিজ আইডিইএতে " বিল্ড আর্টিফ্যাক্ট ... " ক্লিক করি তখন আমি একটি জেআর ফাইল পাই। তবে আমি একই ত্রুটি দিয়ে শেষ করছি ...

আমি এসবিটিতে নতুন এবং ইন্টেলিজ আইডিই নিয়ে খুব বেশি পরীক্ষা নিরীক্ষা করি না।

ধন্যবাদ


4
জিনিসগুলির শব্দে আপনার META-INFফাইলগুলি ফিল্টার করতে হবে - এমন একটি ব্লগ পোস্ট যা সহায়তা করতে পারে: janschulte.wordpress.com/2014/03/20/…
শান ভিয়েরা

উত্তর:


147

অবশেষে আমি আমার বিশ্বব্যাপী বোঝার শব্দে শব্দটি এড়াতে ইন্টেলিজ আইডিইএ ব্যবহার করে পুরোপুরি এড়িয়ে চলেছি :)

আমি অফিসিয়াল এসবিটি টিউটোরিয়াল পড়া শুরু করেছি ।

আমি নিম্নলিখিত ফাইল কাঠামো দিয়ে আমার প্রকল্প তৈরি করেছি:

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

যোগ করা হয়েছে SBT-সমাবেশ প্লাগ ইন আমার মধ্যে assembly.sbt ফাইল। আমাকে একটি ফ্যাট জার তৈরির অনুমতি দিচ্ছে:

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

আমার ন্যূনতম বিল্ড.এসবিটি দেখতে দেখতে:

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"চূড়ান্ত ফ্যাট জেআর-তে নির্ভরতা অন্তর্ভুক্ত না করার উপায় (সেই লাইব্রেরিগুলি ইতিমধ্যে আমার কর্মীদের মধ্যে অন্তর্ভুক্ত রয়েছে)

দ্রষ্টব্য : এই উত্তরটির দ্বারা অনুপ্রাণিত মেটা-আইএনএফ ছাড়ছে

দ্রষ্টব্য : এর অর্থ %এবং%%

এখন আমি আমার / আমার-প্রকল্পের মূল ফোল্ডারে নিম্নলিখিত কমান্ডটি চালিয়ে এসবিটি (এটি কীভাবে ইনস্টল করব ) ব্যবহার করে আমার ফ্যাট জেআর তৈরি করতে পারি :

sbt assembly

আমার ফ্যাট জার এখন নতুন উত্পন্ন / টার্গেট ফোল্ডারে অবস্থিত :

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

আশা করি এটি অন্য কাউকে সাহায্য করবে।


যারা ইন্টেলিজ আইডিই-তে এসবিটি সঞ্চার করতে চান তাদের জন্য: কীভাবে ইন্টেলিজ আইডিইএ থেকে এসবিটি-এসেম্বলির কাজগুলি চালানো যায়?


4
জাভা / মাভেনের পরামর্শ [ ডাটাব্রিক্স
বুদ্ধি

4
@ জিমলোহসের যথাযথ লিঙ্কটি হ'ল ডেটাব্রিকস.আইইটি
জেকে ফাস্ট

4
পুরানো মেটা-আইএনএফ ছাড়ার কারণ কী?
কিড

4
দ্রষ্টব্য:% "সরবরাহিত" এর অর্থ চূড়ান্ত ফ্যাট জেআর-তে নির্ভরতা অন্তর্ভুক্ত না করা যা আমাকে সাহায্য করেছে!
জয়সাগর

মারাত্মকভাবে অবাক হয়ে গেছে যে এটিই একমাত্র প্লাগইন উপলভ্য - এমনকি অফিশিয়ালও নয়, এমনকি এসবিটি সংস্করণ জুড়েও কাজ করে না
দুবে

40

ইন্টেলিজ আইডিয়ায় উবার জেআর / ফ্যাট জেআর তৈরির জন্য 3 ধাপ প্রক্রিয়া:

উবার জেআর / ফ্যাট জেআর: জেআর ফাইলের মধ্যে সমস্ত বাহ্যিক লাইব্রেরি নির্ভরতা রয়েছে।

  1. ইন্টেলিজ আইডিয়ায় এসবিটি এসেম্বলি প্লাগইন যুক্ত করা হচ্ছে

    প্লাগিন এসবিটি পাথ

    যান ProjectName / প্রকল্প / লক্ষ্য / plugins.sbt ফাইল এবং এই লাইন যোগaddSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

  2. বিল্ড.এসবিটিতে মার্জ, বাতিল এবং কৌশল যুক্ত করবেন না যোগ করা

    এসবিটি পাথ তৈরি করুন

    প্রোজেক্টনাম / বিল্ড.এসবিটি ফাইলটিতে যান এবং একটি উবার জেআর এর প্যাকেজিংয়ের কৌশল যুক্ত করুন

    মার্জ কৌশল: যদি গ্রন্থাগারের কোনও সংস্করণ সম্পর্কে দুটি প্যাকেজের মধ্যে দ্বন্দ্ব হয় তবে উবার জেআরে কোনটি প্যাক করবে।
    কৌশল ত্যাগ করুন: লাইব্রেরি থেকে এমন কিছু ফাইল সরিয়ে ফেলার জন্য যা আপনি উবার জেআর-তে প্যাকেজ করতে চান না।
    কৌশল যুক্ত করবেন না : উবার জেআর-তে কিছু প্যাকেজ যুক্ত করবেন না।
    প্রাক্তন হিসাবে: spark-coreইতিমধ্যে আপনার স্পার্ক ক্লাস্টারে উপস্থিত থাকবে o সুতরাং আমাদের এটি উবার জেআর-তে প্যাকেজ করা উচিত নয়

    কৌশল একত্রিত করুন এবং কৌশল বেসিক কোডটি বাতিল করুন:

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

    সুতরাং আপনি এই কমান্ডটি ব্যবহার করে মেটা-আইএনএফ ফাইলগুলি বাতিল করতে বলছেন এবং এই কমান্ডটি ব্যবহার করে যদি কোনও বিরোধ MergeStrategy.discardহয় তবে আপনি বাকী ফাইলগুলি লাইব্রেরি ফাইলের প্রথম ঘটনাটি নিচ্ছেন MergeStrategy.first

    কৌশল বেসিক কোডটি যুক্ত করবেন না:

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

    যদি আমরা আমাদের উবার জেআর ফাইলটিতে স্পার্ক-কোরটি যুক্ত করতে না চাই কারণ এটি ইতিমধ্যে আমাদের ক্লাস্টারটিতে রয়েছে, সুতরাং আমরা % "provided"এটির পাঠাগার নির্ভরতাটির শেষে যুক্ত করছি ।

  3. এর সমস্ত নির্ভরতা সহ উবার জেআর তৈরি করা

    sbtasorses

    sbt assemblyপ্যাকেজ তৈরির জন্য টার্মিনাল টাইপ করুন


ভয়েলা !!! উবার জেআর তৈরি করা হয়েছে। জেআর প্রজেক্টনাম / লক্ষ্য / স্কালা-এক্সএক্স এ থাকবে

জারবিল্ট


16

আপনার প্রকল্প / plugins.sbt- এ নিম্নলিখিত লাইনটি যুক্ত করুন

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

আপনার বিল্ড.এসবিটিতে নিম্নলিখিতগুলি যুক্ত করুন

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
}

ফ্যাট জার তৈরি করার সময় সংঘটিত বিরোধগুলি মীমাংসার জন্য অ্যাসেম্বলি মার্জ কৌশলটি ব্যবহৃত হয়।


4
আপনি কনসোলে "এসবিটি সমাবেশ" চালিয়ে ফ্যাট জার তৈরি করতে পারেন
এআরএমভি

4
স্কেল সংস্করণ 2.11.8 (এসবিটি সংস্করণ: 0.13.12) এর জন্য প্রকল্প / সমাবেশ.এসবিটি-তে এডিএমবিপিপ্লুগিন ("com.eed3si9n"% "এসবিটি-সমাবেশ"% "0.12.0") দিন
এআরএমভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.