Исключение сборочного узла SBT

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

Я бы хотел:

  • sbt run - все должно быть скомпилировано и израсходовано
  • sbt smallAssembly - создать банку без искры
  • sbt assembly - создайте банку uber со всем (включая искру) для удобства развертывания.

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

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

Ответ 1

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

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

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

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

packageBin

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

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

Последний вариант - использовать 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"}
}

Ответ 2

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

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

в Build.sbt