Как построить Uber JAR (Fat JAR) с помощью SBT в IntelliJ IDEA?

Я использую SBT (в IntelliJ IDEA) для создания простого проекта Scala.

Я хотел бы знать, что такое самый простой способ построить Uber JAR файл (он же Fat JAR, Super JAR).

В настоящее время я использую SBT, но когда я отправляю свой файл JAR в Apache Spark Я получаю следующую ошибку:

исключение в потоке" main " java.ленг.Исключение Securityexception: Недопустимый дайджест файла подписи для Манифеста основные атрибуты

или эта ошибка во время компиляции:

java.ленг.RuntimeException: дедупликация: найдено другое содержимое файла в следующем:
ПУТЬЗАВИСИМОСТЬ.jar: META-INF/DEPENDENCIES
ПУТЬЗАВИСИМОСТЬ.jar: META-INF/MANIFEST.MF

Это выглядит так: это потому, что некоторые из моих зависимостей включают файлы сигнатур (META-INF) , которые необходимо удалить в окончательной банке Uber файл.

Я попытался использовать sbt-сборка плагин вроде этого:

/проекта/сборки.sbt

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

/проекта/Плагины.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. Но в итоге я совершаю ту же ошибку...

Я новичок в SBT и не очень экспериментировал с IntelliJ IDE.

спасибо.

3 ответов


наконец, я полностью пропускаю использование IntelliJ IDEA, чтобы избежать создания шума в моем глобальном понимании:)

я начал читать официальный учебник SBT.

Я создал свой проект со следующей файловой структурой:

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

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "1.2.0" % "provided",
  "org.apache.spark" %% "spark-streaming" % "1.2.0" % "provided",
  "org.apache.spark" % "spark-streaming-twitter_2.10" % "1.2.0"
)

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

Примечание: элемент % "provided" означает не включать зависимость в финальную банку fat (эти библиотеки уже включены в мои рабочие)

Примечание: META-INF отбрасывание вдохновленный этим answser.

Примечание: значение % и %%

теперь я могу построить свою жирную банку с помощью SBT (как установить это), выполнив следующую команду в my / my-project корневую папку:

sbt assembly

моя жирная банка теперь находится в новом сгенерированном / target:

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

надеюсь, что это поможет кому-то еще.


для тех, кто хочет embeed SBT в рамках интегрированной среды разработки IntelliJ: как запустить задачи sbt-assembly из IntelliJ IDEA?


процесс 3 шагов для построения Uber JAR / Fat JAR в IntelliJ Idea:

Uber JAR/Fat JAR: файл JAR, имеющий все внешние зависимости libraray в нем.

  1. добавление плагина сборки SBT в IntelliJ Idea

    Plugin sbt Path

    на имя проекта / проект / цель / Плагины.sbt файл и добавьте эту строку addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

  2. добавление слияния, отбрасывание и не добавлять стратегия в построении.sbt

    Build sbt Path

    на имя проекта / сборка.sbt файл и добавить стратегию упаковки Uber JAR

    Стратегия Объединения : если есть конфликт в двух пакетах о версии библиотеки, то какой из них упаковать в Uber JAR.
    Отменить Стратегию : чтобы удалить некоторые файлы из библиотеки, которые вы не хотите упаковывать в Uber JAR.
    не добавлять Стратегия: не добавляйте пакет в Uber JAR.
    например: spark-core уже будет присутствовать в вашем кластере Spark.Поэтому мы не должны упаковывать это в Uber JAR

    стратегия слияния и отбросить основной код стратегии:

    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"

    если мы не хотим добавлять spark-core в наш файл Uber JAR, поскольку он уже будет на нашем клаттере, поэтому мы добавляем % "provided" в конце зависимости от библиотеки ИТ.

  3. создание Uber JAR со всеми его зависимостями

    sbtassembly

    в типа терминал sbt assembly для наращивания пакет


Вуаля!!! Uber JAR построен. JAR будет в имя проекта/цель / scala-XX

JarBuilt


добавьте следующую строку в ваш проект/Плагины.sbt

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

добавьте в свою сборку следующее.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
}

стратегия слияния сборки используется для разрешения конфликтов, возникших при создании fat jar.