Cómo construir un Uber JAR (Fat JAR) usando SBT dentro de IntelliJ IDEA?


Estoy usando SBT (dentro de IntelliJ IDEA) para construir un proyecto Scala simple.

Me gustaría saber cuál es la forma más sencilla para construir un archivo Uber JAR (también conocido como Fat JAR, Super JAR).

Actualmente estoy usando SBT, pero cuando estoy enviando mi archivo JAR a Apache Spark obtengo el siguiente error:

Excepción en el hilo "main" java.lang.SecurityException: Inválido resumen del archivo de firma para los atributos principales del Manifiesto

O esto error durante el tiempo de compilación:

Java.lang.RuntimeException: reduplicar: archivo diferentes contenidos en lo siguiente:
RUTA \ DEPENDENCIA.jar: META-INF / DEPENDENCIES
RUTA \ DEPENDENCIA.jar: META-INF / MANIFEST.MF

Se parece a es porque algunas de mis dependencias incluyen archivos de firma (META-INF) que deben eliminarse en el archivo Uber JAR final.

Traté de usar el sbt-assembly plugin como que:

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

Cuando hago clic en " Construir Artefacto..." en IntelliJ IDEA obtengo un archivo JAR. Pero termino con el mismo error...

Soy nuevo en SBT y no muy experimentado con IntelliJ IDE.

Gracias.

Author: Yves M., 2015-02-11

3 answers

Finalmente omito totalmente el uso de IntelliJ IDEA para evitar generar ruido en mi comprensión global:)

Empecé a leer el tutorial oficial de SBT.

He creado mi proyecto con la siguiente estructura de archivos:

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

Se ha añadido el sbt-assembly plugin en mi ensamblado .archivo sbt . Lo que me permite construir un FRASCO de grasa:

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

Mi compilación mínima .sbt se parece a:

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
   }
}

Nota : % "provided" significa no incluir la dependencia en el BOTE de grasa final (esas bibliotecas ya están incluidas en mis trabajadores)

Nota : META-INF descartando inspirado en esta respuesta.

Nota: Significado de % y %%

Ahora puedo construir mi fat JAR usando SBT (cómo instalarlo) ejecutando el siguiente comando en mi carpeta raíz /my-project :

sbt assembly

Mi TARRO de grasa ahora se encuentra en la nueva carpeta generada /target:

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

Espero que eso ayude a alguien más.


Para aquellos que quieren embeder SBT dentro de IntelliJ IDE: ¿Cómo ejecutar tareas de ensamblaje sbt desde dentro de IntelliJ IDEA?

 115
Author: Yves M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:24

Proceso De 3 Pasos Para Construir Uber JAR / Fat JAR en IntelliJ Idea:

Uber JAR / Fat JAR : Archivo JAR que contiene todas las dependencias externas de libraray.

  1. Agregar el complemento de ensamblaje SBT en IntelliJ Idea

    Ruta del Plugin sbt

    Vaya a Nombreproyecto/proyecto/destino/plugins.sbt archivo y añadir esta línea addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

  2. Añadiendo Combinar,Descartar y No Añadir estrategia en build.sbt

    Construir ruta sbt

    Ir a ProjectName/build.sbt archivar y añadir la Estrategia de Empaquetado de un Uber JAR

    Merge Strategy: Si hay conflicto en dos paquetes sobre una versión de la biblioteca, entonces cuál empaquetar en Uber JAR.
    Descartar Estrategia: Para eliminar algunos archivos de la biblioteca que no desea empaquetar en Uber JAR.
    No agregar Estrategia : No agregar algún paquete a Uber JAR.
    Por ejemplo: spark-core ya estará presente en tu Chispa Cluster.So nosotros no debería empaquetar esto en Uber JAR

    Combinar Estrategia y Descartar Estrategia Código Básico:

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

    Así que está pidiendo descartar archivos META-INF usando este comando MergeStrategy.discard y para el resto de los archivos está tomando el primera ocurrencia del archivo de biblioteca si hay algún conflicto usando este comando MergeStrategy.first.

    No Agregue el Código Básico de Estrategia:

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

    Si no queremos añadir el spark-core a nuestro Uber JAR archivo como ya estará en nuestro clutser, por lo que estamos agregando la % "provided" al final de la dependencia de la biblioteca.

  3. Edificio Uber FRASCO con todas sus dependencias

    sbtassembly

    En el tipo de terminal sbt assembly para construir el paquete


¡Voila!!! Uber JAR está construido. JAR estará en ProjectName / target / scala-XX

JarBuilt

 34
Author: Ajay Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-06 04:17:28

Agrega la siguiente línea a tu proyecto/plugins.sbt

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

Agrega lo siguiente a tu compilación.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
}

La estrategia de combinación de ensamblado se utiliza para resolver los conflictos que se produjeron al crear fat jar.

 12
Author: ARMV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-17 10:42:13