Comment construire un Uber JAR (FAT JAR) en utilisant SBT dans IntelliJ idée?

J'utilise SBT (dans IntelliJ IDEA) pour construire un projet Scala simple.

je voudrais savoir ce qu'est le la manière la plus simple pour construire un Uber JAR fichier (ALIAS FAT JAR, Super JAR).

j'utilise actuellement SBT mais lorsque je soumets mon fichier JAR à Apache Spark j'obtiens l'erreur suivante:

Exception dans le fil " main" Java.lang.SecurityException: Invalide fichier de signature digérer pour Manifester les attributs principaux

Ou cette erreur lors de la compilation:

de java.lang.RuntimeException: deduplicate: différents contenus de fichier trouvés dans les termes suivants:

PATHDEPENDENCY.jar: META-INF / DEPENDENCIES

PATHDEPENDENCY.jar: META-INF / MANIFEST.MF

It ressemble à c'est parce que certaines de mes dépendances incluent des fichiers de signature (META-INF) qui doivent être supprimés dans le fichier Uber JAR final.

j'ai essayé d'utiliser le sbt-assemblée plugin comme ça:

/projet/de l'assemblée.sbt

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

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

quand je clique " Construire Artefact... " dans IntelliJ IDEA-je obtenir un fichier JAR. Mais je me retrouve avec la même erreur...

je suis nouveau au SBT et pas très expérimenté avec IntelliJ IDE.

Merci.

70
demandé sur Yves M. 2015-02-11 19:25:41

3 réponses

enfin je passe totalement en utilisant IntelliJ idée pour éviter de générer du bruit dans ma compréhension globale:)

j'ai commencé à lire le tutoriel officiel SBT .

j'ai créé mon projet avec la structure de fichier suivante:

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

a ajouté le sbt-Assemblée 1519190920" plugin dans mon Assemblée.sbt fichier. Me permettre de construire un pot de graisse:

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

Mon minimal "1519210920 de construire".sbt ressemble à:

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

Note : le % "provided" signifie Ne pas inclure la dépendance dans le pot de fat final (ces bibliothèques sont déjà incluses dans mes ouvriers)

Note : META-INF rejet inspiré par cette answser .

Note : Signification de % et %%

maintenant je peux construire mon FAT JAR en utilisant SBT ( comment l'installer ) en exécutant la commande suivante dans mon /mon-projet dossier racine:

sbt assembly

Mon gras BOCAL est maintenant situé dans le nouveau /cible dossier :

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

Espère que ça aide quelqu'un d'autre.


pour ceux qui veulent intégrer SBT dans IntelliJ IDE: comment exécuter des tâches d'assemblage sbt dans IntelliJ IDEA?

115
répondu Yves M. 2017-05-23 11:47:24

procédé en trois étapes pour la construction de pot Uber / pot Fat dans IntelliJ idée:

Uber JAR/Fat JAR : fichier JAR contenant toutes les dépendances externes de libraray.

  1. Ajouter un plugin D'assemblage SBT dans IntelliJ Idea



    Plugin sbt Path

    Aller à Nomduprojet/projet/cible/plugins.sbt produisez et ajoutez cette ligne addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

  2. ajouter fusionner,jeter et ne pas ajouter de stratégie dans build.sbt



    Build sbt Path

    Aller à ProjectName/build.sbt du fichier et ajoutez la Stratégie pour l'Emballage d'un Uber JAR

    stratégie de fusion: S'il y a un conflit dans deux paquets au sujet d'une version de la bibliothèque, alors laquelle doit être emballée dans Uber JAR.

    stratégie de rejet: pour supprimer certains fichiers de la bibliothèque que vous ne voulez pas empaqueter dans Uber JAR.

    Ne pas Ajouter de Stratégie : Ne pas ajouter un paquet d'Uber JAR.

    pour ex: spark-core sera déjà présent à ton faisceau D'étincelles.Nous ne devrions donc pas l'emballer dans Uber JAR

    stratégie de fusion et Stratégie de rejet code de base:

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

    donc vous demandez de rejeter les fichiers META-INF en utilisant cette commande MergeStrategy.discard et pour le reste des fichiers vous prenez la première occurrence du fichier de bibliothèque s'il y a un conflit en utilisant cette commande MergeStrategy.first .

    ne pas ajouter de code de base de stratégie:

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

    si nous ne voulons pas ajouter le spark-core à notre fichier Uber JAR comme il le sera déjà sur notre clutser, nous ajoutons donc le % "provided" à la fin de la dépendance de bibliothèque informatique.

  3. la Construction d'Uber POT avec toutes ses dépendances



    sbtassembly

    dans le type de terminal sbt assembly pour la construction du paquet



Voila!!! Uber JAR est construit. POT sera en Nomprojet/cible/scala-XX



JarBuilt

34
répondu Ajay Gupta 2015-10-06 04:17:28

Ajouter la ligne suivante à votre projet/plugins.sbt

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

ajoutez ce qui suit à votre Compilation.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 stratégie de fusion de L'Assemblée est utilisée pour résoudre les conflits survenus lors de la création de fat jar.

12
répondu ARMV 2015-02-17 10:42:13