SBT сборка банок исключение
Я использую spark (в java API) и требую один jar, который можно отправить в кластер, однако сам jar не должен включать spark. Приложение, которое развертывает работу, конечно, должно включать искру.
Мне бы хотелось:
- sbt run - все должно быть скомпилировано и выполнено
- sbt smallAssembly - создайте банку без искры
- Сборка sbt - создайте uber jar со всем (включая spark) для простоты развертывания.
У меня 1. и 3. работает. Любые идеи о том, как я могу 2.? Какой код мне нужно добавить в мой файл build.sbt?
Этот вопрос касается не только искры, но и любой другой зависимости, которую я также могу исключить.
2 ответа
% "предоставленная" конфигурация
Первый вариант, чтобы исключить банку из толстой банки, это использовать "provided"
Конфигурация на зависимости библиотеки. "provided"
исходит из предоставленной области Maven, которая определяется следующим образом:
Это очень похоже на
compile
, но указывает, что вы ожидаете, что JDK или контейнер предоставят зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость для API сервлета и связанных API Java EEprovided
потому что веб-контейнер предоставляет эти классы. Эта область доступна только для пути к классам компиляции и тестирования и не является транзитивной.
Поскольку вы развертываете свой код в контейнере (в данном случае 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