首页 > 解决方案 > 具有 spark 依赖项的 Scalatra 应用程序返回 java.lang.NoSuchFieldError: INSTANCE 由于多个 httpclient 版本

问题描述

我正在尝试构建一个使用 spark 运行代码的 Scalatra 应用程序。我实际上可以构建 fat jarsbt-assembly并且端点可以工作,但是在运行测试时org.scalatra.test.scalatest._出现以下错误:

*** RUN ABORTED ***
  java.lang.NoSuchFieldError: INSTANCE
  at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:146)
  at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:964)
  at org.scalatra.test.HttpComponentsClient$class.createClient(HttpComponentsClient.scala:100)
  at my.package.MyServletTests.createClient(MyServletTests.scala:5)
  at org.scalatra.test.HttpComponentsClient$class.submit(HttpComponentsClient.scala:63)
  at my.package.MyServletTests.submit(MyServletTests.scala:5)
  at org.scalatra.test.Client$class.post(Client.scala:62)
  at my.package.MyServletTests.post(MyServletTests.scala:5)
  at org.scalatra.test.Client$class.post(Client.scala:60)
  at my.package.MyServletTests.post(MyServletTests.scala:5)
  ...

从其他来源来看,这似乎是一个httpclient版本错误,因为 Scalatra 和 Spark 使用不同的版本。这些消息来源建议使用 Maven Shade 插件来重命名这些版本之一。但是,我使用的是 sbt 而不是 Maven。尽管 sbt 具有遮蔽功能,但它在创建 fat jar 时可以工作,我在开发测试期间需要这个解决方案。来源是:

有没有办法使用 SBT 解决这种冲突?我正在运行 Eclipse Scala-IDE,这些是我的依赖项built.sbt

val scalatraVersion = "2.6.5"

// scalatra
libraryDependencies ++= Seq(
  "org.scalatra"  %% "scalatra"           % scalatraVersion,
  "org.scalatra"  %% "scalatra-scalatest" % scalatraVersion % "test",
  "org.scalatra"  %% "scalatra-specs2"    % scalatraVersion,
  "org.scalatra"  %% "scalatra-swagger"   % scalatraVersion,
  "ch.qos.logback" % "logback-classic"    % "1.2.3" % "runtime",
  "org.eclipse.jetty" % "jetty-webapp"    % "9.4.9.v20180320" % "container;compile",
  "javax.servlet"  % "javax.servlet-api"  % "3.1.0" % "provided"
)

// From other projects:
// spark
libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "2.4.0",
    "org.apache.spark" %% "spark-mllib" % "2.4.0",
    "org.apache.spark" %% "spark-sql" % "2.4.0"
)

// scalatest
libraryDependencies += "org.scalatest" % "scalatest_2.11" % "3.0.5" % "test"

标签: scalaapache-sparksbtscalatra

解决方案


推荐阅读