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.
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?
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.
-
Ajouter un plugin D'assemblage SBT dans IntelliJ Idea
Aller à Nomduprojet/projet/cible/plugins.sbt produisez et ajoutez cette ligne
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
-
ajouter fusionner,jeter et ne pas ajouter de stratégie dans build.sbt
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 commandeMergeStrategy.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.
-
la Construction d'Uber POT avec toutes ses dépendances
dans le type de terminal
sbt assembly
pour la construction du paquet
Voila!!! Uber JAR est construit. POT sera en Nomprojet/cible/scala-XX
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.