Столкновения между классами аммонитов и Github4s (java.lang.AbstractMethodError)

Я пишу аммонитовый скрипт для работы с библиотекой Github4s для доступа к github api и возникновения проблемы, возможно, с classpath. Простая версия скрипта выглядит следующим образом:

import $ivy.`com.47deg::github4s:0.17.0`, github4s.Github, github4s.Github._, github4s.jvm.Implicits._, scalaj.http.HttpResponse

val listCommits = Github().repos.listCommits("lihaoyi", "ammonite")

listCommits.exec[cats.Id, HttpResponse[String]]() match {
  case Left(e) => println(s"Something went wrong: ${e.getMessage}")
  case Right(r) => r.result.foreach { commit => println(s"${commit.sha}: 
    ${commit.message.take(35)}") }
}

Он в значительной степени скопирован из учебника по github4s и не работает с:

java.lang.AbstractMethodError
  jawn.CharBasedParser.parseString(CharBasedParser.scala:90)
  jawn.CharBasedParser.parseString$(CharBasedParser.scala:87)
  jawn.StringParser.parseString(StringParser.scala:15)
  jawn.Parser.rparse(Parser.scala:428)
  jawn.Parser.parse(Parser.scala:337)
  jawn.SyncParser.parse(SyncParser.scala:24)
  jawn.SupportParser.$anonfun$parseFromString$1(SupportParser.scala:15)
  jawn.SupportParser.parseFromString(SupportParser.scala:15)
  jawn.SupportParser.parseFromString$(SupportParser.scala:14)
  io.circe.jawn.CirceSupportParser$.parseFromString(CirceSupportParser.scala:7)
  io.circe.jawn.JawnParser.parse(JawnParser.scala:16)
  io.circe.parser.package$.parse(package.scala:8)
  io.circe.Parser.decode(Parser.scala:26)
  io.circe.Parser.decode$(Parser.scala:25)
  io.circe.parser.package$.decode(package.scala:5)
  github4s.HttpRequestBuilderExtensionJVM.decodeEntity(HttpRequestBuilderExtensionJVM.scala:89)
  github4s.HttpRequestBuilderExtensionJVM.decodeEntity$(HttpRequestBuilderExtensionJVM.scala:88)
  github4s.jvm.Implicits$.decodeEntity(Implicits.scala:21)

Точно такой же код работает в простом SBT-проекте, который заставляет меня думать, что Ammonite внедряет что-то в classpath и нарушает работу github4s.

Есть ли способ получить более чистый путь к классам в аммонитовых сценариях или как еще можно обойти эту проблему?

1 ответ

Решение

У меня была такая же проблема, как и у вас. Вот что я понял:

Аммонит 1.0.3 действительно использует (косвенно) челюсти 0.10.4 (по upickle). Однако нестабильная версия Ammonite уже перенесена на более новую версию upickle, в которой используются челюсти 0.11.

Так что с нестабильным аммонитом я смог справиться со своей проблемой, не сталкиваясь с AbstractMethodError вопрос.

Другие вопросы по тегам