Как определить Scala API для Kafka Streams как зависимость в build.sbt? - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь запустить новый проект SBT Scala и получить в файле build.sbt следующее:

name := "ScalaKafkaStreamsDemo"
version := "1.0"
scalaVersion := "2.12.1"

libraryDependencies += "javax.ws.rs" % "javax.ws.rs-api" % "2.1" artifacts(Artifact("javax.ws.rs-api", "jar", "jar"))

libraryDependencies += "org.apache.kafka" %% "kafka" % "2.0.0"
libraryDependencies += "org.apache.kafka" % "kafka-streams" % "2.0.0"

Итак, в соответствии с GitHub repo , в 2.0.0 Iдолжны видеть классы / функции Scala и т. д., которые я хочу использовать, однако они просто не доступны.В IntelliJ я могу открыть kafka-streams-2.0.0.jar, но я не вижу никаких классов Scala.

Есть ли еще один JAR-файл, который мне нужно включить?

Как раз, когда мы находимся на предметедополнительные JAR, кто-нибудь знает, что JAR мне нужно включить, чтобы иметь возможность использовать EmbeddedKafkaCluster?

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Похоже, вы столкнулись с проблемой неразрешенной зависимости javax.ws.rs-api, которая возникает с некоторыми проектами Java, которые являются прямыми или транзитивными зависимостями проектов Scala, использующих sbt.Я сталкивался с этим в проектах Scala, которые используют Apache Spark, а недавно - в Kafka Streams (с и без Scala API).

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

excludeDependencies += ExclusionRule("javax.ws.rs", "javax.ws.rs-api")
libraryDependencies += "javax.ws.rs" % "javax.ws.rs-api" % "2.1.1"

Убедитесь, что вы используете самую последнюю и наибольшую из sbt (т.е. 1.2.7 на момент написания этой статьи).

С учетом вышесказанного зависимости в build.sbt должны быть следующими:

scalaVersion := "2.12.8"

val kafkaVer = "2.1.0"
libraryDependencies += "org.apache.kafka" % "kafka-streams" % kafkaVer
libraryDependencies += "org.apache.kafka" %% "kafka-streams-scala" % kafkaVer

excludeDependencies += ExclusionRule("javax.ws.rs", "javax.ws.rs-api")
libraryDependencies += "javax.ws.rs" % "javax.ws.rs-api" % "2.1.1"

В IntelliJ я могу открыть kafka-streams-2.0.0.jar, но я неувидеть любые классы Scala.Есть ли другой JAR-файл, который мне нужно включить?

Следующая зависимость - это все, что вам нужно:

libraryDependencies += "org.apache.kafka" %% "kafka-streams-scala" % kafkaVer
0 голосов
/ 30 декабря 2018

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

import sbt._
object PackagingTypePlugin extends AutoPlugin {
  override val buildSettings = {
    sys.props += "packaging.type" -> "jar"
    Nil
  }
}
0 голосов
/ 13 декабря 2018

Нужный артефакт: kafka-streams-scala:

libraryDependencies += "org.apache.kafka" %% "kafka-streams-scala" % "2.0.1"

(пожалуйста, используйте 2.0.1 или даже лучше 2.1.0, поскольку в 2.0.0 есть некоторые ошибки API-интерфейса scala)

Чтобы ответить на ваш последний вопрос, он находится в тестовой фляге, к которой вы можете обратиться с помощью классификатора:

libraryDependencies += "org.apache.kafka" %% "kafka-streams" % "2.0.1" % "test" classifier "test"

Но учтите, что это внутренний класс и может быть изменен (или удален) безуведомление.Если это вообще возможно, настоятельно рекомендуется использовать TopologyTestDriver в test-utils вместо:

libraryDependencies += "org.apache.kafka" %% "kafka-streams-test-utils" % "2.0.1" % "test"
...