1

I'm trying to build an Scalatra application that runs code with spark. I can actually build the fat jar with sbt-assembly and the endpoints work, but when running tests with org.scalatra.test.scalatest._ I get the following error:

*** 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)
  ...

From other sources, this seemed to be an httpclient version error, since both Scalatra and Spark use different versions. These sources suggested the use of Maven Shade Plugin to rename one of these versions. I am, however, using sbt instead of Maven. Even though sbt has a shade functionality, it works when creating the fat jar, and I need this solution during development tests. Sources are:

Is there any way to resolve this kind of conflict using SBT? I'm running Eclipse Scala-IDE and these are my dependencies in 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"
Edgar
  • 256
  • 2
  • 12

0 Answers0