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.
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.
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?
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.
-
Agregar el complemento de ensamblaje SBT en IntelliJ Idea
Vaya a Nombreproyecto/proyecto/destino/plugins.sbt archivo y añadir esta línea
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
-
Añadiendo Combinar,Descartar y No Añadir estrategia en build.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 JARCombinar 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 comandoMergeStrategy.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. -
Edificio Uber FRASCO con todas sus dependencias
En el tipo de terminal
sbt assembly
para construir el paquete
¡Voila!!! Uber JAR está construido. JAR estará en ProjectName / target / scala-XX
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.
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