2017-07-30 53 views
0

我正在尝试构建一个“hello world”-esque应用程序,该应用程序使用Spark流从Kafka代理(此作品)流式传输数据,过滤/处理此数据并将其推送到(本地)Web浏览器Scalatra Web框架及其支持的来自Atmosphere的Web套接字功能。 Kafka/Spark块独立工作,Scalatra/Atmosphere块也独立工作。当我试图将两个部分放在一起时,我遇到了库依赖关系的问题。如何解决SBT的库依赖性警告?

真正的问题:我该如何选择Spark将与Scalatra搭配使用的库版本?

裸露的骨头了Scalatra /大气的应用程序正常工作如下:

organization := "com.example" 
name := "example app" 
version := "0.1.0" 
scalaVersion := "2.12.2" 

val ScalatraVersion = "2.5.+" 

libraryDependencies ++= Seq(
    "org.json4s"     %% "json4s-jackson"  % "3.5.2", 
    "org.scalatra"    %% "scalatra"   % ScalatraVersion, 
    "org.scalatra"    %% "scalatra-scalate" % ScalatraVersion, 
    "org.scalatra"    %% "scalatra-specs2"  % ScalatraVersion % "test", 
    "org.scalatra"    %% "scalatra-atmosphere" % ScalatraVersion, 
    "org.eclipse.jetty"   % "jetty-webapp"  % "9.4.6.v20170531" % "provided", 
    "javax.servlet"    % "javax.servlet-api" % "3.1.0"   % "provided" 
) 

enablePlugins(JettyPlugin) 

但是,如果我添加了火花新的依赖和Spark流,上下敲斯卡拉版本2.11(对于火花卡夫卡要求流):

organization := "com.example" 
name := "example app" 
version := "0.1.0" 
scalaVersion := "2.11.8" 

val ScalatraVersion = "2.5.+" 
val SparkVersion = "2.2.0" 

libraryDependencies ++= Seq(
    "org.json4s"     %% "json4s-jackson"  % "3.5.2", 
    "org.scalatra"    %% "scalatra"   % ScalatraVersion, 
    "org.scalatra"    %% "scalatra-scalate" % ScalatraVersion, 
    "org.scalatra"    %% "scalatra-specs2"  % ScalatraVersion % "test", 
    "org.scalatra"    %% "scalatra-atmosphere" % ScalatraVersion, 
    "org.eclipse.jetty"   % "jetty-webapp"  % "9.4.6.v20170531" % "provided", 
    "javax.servlet"    % "javax.servlet-api" % "3.1.0"   % "provided" 
) 

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % SparkVersion, 
    "org.apache.spark" %% "spark-streaming" % SparkVersion, 
    "org.apache.spark" %% "spark-streaming-kafka-0-8" % SparkVersion 
) 

enablePlugins(JettyPlugin) 

代码编译,但我得到SBT的驱逐警告:

[warn] There may be incompatibilities among your library dependencies. 
[warn] Here are some of the libraries that were evicted: 
[warn] * org.json4s:json4s-jackson_2.11:3.2.11 -> 3.5.3 
[warn] Run 'evicted' to see detailed eviction warnings 

于是最后,当码头试运行Web服务器时,出现此错误:

WARN:oejuc.AbstractLifeCycle:main: FAILED or[email protected]53fb3dab: java.lang.NoClassDefFoundError: com/sun/jersey/spi/inject/InjectableProvider 
java.lang.NoClassDefFoundError: com/sun/jersey/spi/inject/InjectableProvider 

我如何得到这条底线?我是新来的Scala世界,错综复杂的依赖关系正在让我大开眼界。除去驱逐警告

+0

使用依赖关系图插件(https://github.com/jrudolph/sbt-dependency-graph)可能有助于找出驱逐警告出现的原因(火花可能取决于某些更低/更高的v杰克逊队比在其他地方被压制)。您可以使用exclude关键字来摆脱有问题的导入:(请参阅http://www.scala-sbt.org/0.13/docs/Library-Management.html#Exclude+Transitive+Dependencies)。如果这不能解决问题,那么可能需要向GitHub推送最低版本的任何内容,这样我们就可以更轻松地进入该问题。 – prince

+0

谢谢@王子。我认为在切换到scala 2.11后,问题可能与jetty和/或javax servlet有关。我把一个准系统的例子推给了github,并解释了build.sbt注释中的变化流程。如果你能理解这个问题,我会很好奇。编译完成后,“驱逐”任务实际上产生了一长串问题(不仅如我所想的那样只是json4s-jackson)。 https://github.com/ian-wright/scalatra-atmosphere-spark-example/blob/master/build.sbt – EyeWrite

回答

0

一种方法是添加使用dependencyOverrides

试所需的版本库相关添加以下您的SBT文件并重新构建应用程序

dependencyOverrides += "org.json4s" % "json4s-jackson_2.11" % "3.5.3" 

检查SBT文档here

+0

谢谢普拉萨德。我认为这个问题与Scalatra使用的jetty和/或javax servlet有关,在我切换到Scala 2.11(不只是像json4s-jackson_2.11这样的单个依赖项)之后。我把这个项目的一个简单例子推给了github,并解释了build.sbt中的变化,如果你准备采取一个高峰的话:https://github.com/ian-wright/scalatra-atmosphere -spark-示例/斑点/主/ build.sbt – EyeWrite