Ошибка при заливке нативного json4s в простом Scala проекте: «Символ« term org.json4s »отсутствует в пути к классам». - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть простой Scala проект, в котором я хотел бы закрасить json4s-native перед компиляцией своего толстого JAR-файла, используя sbt-assembly. Идея состоит в том, что в моем собственном коде я бы импортировал затемненные Java классы следующим образом.

import acme.shade.org.json4s.native.Json
...

Я попытался использовать следующий упрощенный build.sbt (вдохновленный this ). Идея состоит в том, чтобы создать пустой проект, который зависит от json4s-native, заштриховать классы, а затем иметь фактический проект, зависящий от того JAR, содержащего затененные классы.

val commonSettings = Seq(
  organization := "com.acme",
  version := "1.0.0",
  scalaVersion := "2.11.12",
  test in assembly := {}
)

// Inspiration for shading JARs taken from:
// https://github.com/wsargent/shade-with-sbt-assembly/
lazy val shaded = (project in file("shaded/libs"))
  .settings(commonSettings)
  .settings(
    name := "my-shaded-lib",
    libraryDependencies ++= Seq(
      "org.json4s" %% "json4s-native" % "3.7.0-M2"
    )
  )
  .settings(
    assemblyOption in assembly ~= { _.copy(includeScala = false) },
    assemblyJarName in assembly := s"my-shaded-lib-${version.value}.jar",
    assemblyShadeRules in assembly := Seq(
      ShadeRule.rename("org.json4s.**" -> "acme.shade.@0").inAll
    )
  )

lazy val root = (project in file ("."))
  .settings(commonSettings)
  .settings(
    name := "shadejson4s",
    mainClass in assembly := Some("com.acme.test.Main"),
    unmanagedJars in Compile ++= Seq(
      shaded.base / "target" / s"scala-${scalaBinaryVersion.value}" / s"my-shaded-lib-${version.value}.jar"
    ),
    update := (update dependsOn (shaded / assembly)).value
  )

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

[info] Compiling 1 Scala source to /private/tmp/shade-json4s/target/scala-2.11/classes ...
[error] /private/tmp/shade-json4s/src/main/scala/com/acme/shadejson4s/Main.scala:3:8: Symbol 'term org.json4s' is missing from the classpath.
[error] This symbol is required by ' <none>'.
[error] Make sure that term json4s is in your classpath and check for conflicting dependencies with `-Ylog-classpath`.
[error] A full rebuild may help if 'package.class' was compiled against an incompatible version of org.
[error] import acme.shade.org.json4s.native.Json
[error]        ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 2 s, completed Feb 11, 2020 2:51:01 PM

Чего мне здесь не хватает?

1 Ответ

1 голос
/ 12 февраля 2020

Scala lib не может быть затенено, насколько я знаю: https://contributors.scala-lang.org/t/scala-signature-layout/3327

...