Я создаю приложение Apache Spark в Scala, и я использую SBT для его создания. Вот что:
- когда я разрабатываю IntelliJ IDEA, я хочу, чтобы зависимости Spark были включены в путь к классам (я запускаю регулярное приложение с основным классом)
- когда я упаковываю приложение (благодаря плагину sbt-assembly), я не хочу, чтобы зависимости Spark были включены в мой полный JAR
- когда я запускаю модульные тесты через
sbt test
, я хочу, чтобы зависимости Spark включались в путь к классам (такой же, как # 1, но из SBT).
Чтобы сопоставить ограничение # 2, я объявляю зависимости Spark как provided
:
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-streaming" % sparkVersion % "provided",
...
)
Затем документация по сборке sbt предлагает добавить следующую строку для включения зависимостей для модульных тестов (ограничение # 3):
run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
Это оставляет меня с ограничением # 1 не заполненным, т.е. я не могу запустить приложение в IntelliJ IDEA, поскольку зависимости Spark не подхватываются.
С Maven я использовал конкретный профиль для создания UBER JAR. Таким образом, я объявлял зависимости Spark как регулярные зависимости для основного профиля (IDE и модульные тесты), объявляя их как provided
для полной упаковки JAR. См. https://github.com/aseigneurin/kafka-sandbox/blob/master/pom.xml
Каков наилучший способ добиться этого с помощью SBT?