SBT сборка банок исключение

Я использую spark (в java API) и требую один jar, который можно отправить в кластер, однако сам jar не должен включать spark. Приложение, которое развертывает работу, конечно, должно включать искру.

Мне бы хотелось:

  1. sbt run - все должно быть скомпилировано и выполнено
  2. sbt smallAssembly - создайте банку без искры
  3. Сборка sbt - создайте uber jar со всем (включая spark) для простоты развертывания.

У меня 1. и 3. работает. Любые идеи о том, как я могу 2.? Какой код мне нужно добавить в мой файл build.sbt?

Этот вопрос касается не только искры, но и любой другой зависимости, которую я также могу исключить.

2 ответа

Решение

% "предоставленная" конфигурация

Первый вариант, чтобы исключить банку из толстой банки, это использовать "provided" Конфигурация на зависимости библиотеки. "provided" исходит из предоставленной области Maven, которая определяется следующим образом:

Это очень похоже на compile, но указывает, что вы ожидаете, что JDK или контейнер предоставят зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость для API сервлета и связанных API Java EE provided потому что веб-контейнер предоставляет эти классы. Эта область доступна только для пути к классам компиляции и тестирования и не является транзитивной.

Поскольку вы развертываете свой код в контейнере (в данном случае Spark), в отличие от вашего комментария, вам, вероятно, понадобится стандартная библиотека Scala и другие библиотечные файлы (например, Dispatch, если вы ее использовали). Это не повлияет run или же test,

packageBin

Если вы просто хотите получить исходный код, а не стандартную библиотеку Scala или другие зависимости библиотеки, это будет packageBin встроенный в сб. Этот упакованный jar можно комбинировать с jar-файлом только для зависимостей, который вы можете сделать с помощью sbt-assembly assemblyPackageDependency,

исключены банки в сборке

Последний вариант заключается в использовании excludedJars in assembly:

excludedJars in assembly := {
  val cp = (fullClasspath in assembly).value
  cp filter {_.data.getName == "spark-core_2.9.3-0.8.0-incubating.jar"}
}

Как отметил Евгений Йокота (большое спасибо), для начинающих, таких как я, просто добавьте ключевое слово "% Provided" как

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.0" % Provided
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.4.0" % Provided

в Build.sbt

Другие вопросы по тегам