Как построить 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 в нем.
-
добавление плагина сборки SBT в IntelliJ Idea
на имя проекта / проект / цель / Плагины.sbt файл и добавьте эту строку
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
-
добавление слияния, отбрасывание и не добавлять стратегия в построении.sbt
на имя проекта / сборка.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"
в конце зависимости от библиотеки ИТ. -
создание Uber JAR со всеми его зависимостями
в типа терминал
sbt assembly
для наращивания пакет
Вуаля!!! Uber JAR построен. JAR будет в имя проекта/цель / scala-XX
добавьте следующую строку в ваш проект/Плагины.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.