Приложение, работающее под SBT, не находит класс из jar Classpath

У меня есть проект Scala с использованием SBT. Однако он отлично работает под Eclipse, пытаясь запустить его под sbt (sbt 'run mount 1440' - включая параметры, которые мне нужны) приводит к ClassNotFoundException - не могу найти jnr.ffi.provider.jffi.NativeClosureProxy учебный класс. Тем не менее, работает sbt 'last run' показывает мне, что jnr-ffi-2.0.3.jar Файл (который включает в себя указанный класс) фактически включен в путь к классам. Любые предложения о том, что происходит?

Источники, доступные на github: https://github.com/FileJunkie/vkfs

1 ответ

Решение

Ваша сборка неверна.

Во-первых, вы должны иметь пустые строки между libraryDependecys.

lazy val root = (project in file(".")).
  settings(
    name := "vkfs",
    version := "1.0",
    scalaVersion := "2.11.7"
  )

libraryDependencies += "org.scalaj" %% "scalaj-http" % "1.1.6"

libraryDependencies += "org.json4s" %% "json4s-jackson" % "3.2.11"

libraryDependencies += "com.github.serceman" % "jnr-fuse" % "0.1"

Во-вторых, зависимость "com.github.serceman" не может быть разрешена. Это означает, что либо

  • вы установили зависимость вручную в свой репозиторий Ivy по адресу .ivy или же
  • вы не указали правильный распознаватель (см. http://www.scala-sbt.org/0.13/docs/Resolvers.html)

Итак, в итоге, кажется, что Eclipse делает что-то автоматически, поэтому ваша программа работает. Когда дело доходит до вашего build.sbt он недействителен (пустые строки отсутствуют) и не разрешает зависимости должным образом. Интересно, как вы могли начать через sbt 'run mount 1440' совсем.

После исправления пустых строк и запуска sbt 'run mount 1440' я получаю

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
[info] Set current project to vkfs (in build file:/home/.../IdeaProjects/vkfs/)
[info] Updating {file:/home/.../IdeaProjects/vkfs/}root...
[info] Resolving com.github.serceman#jnr-fuse;0.1 ...
[warn]  module not found: com.github.serceman#jnr-fuse;0.1
[warn] ==== local: tried
[warn]   /home/.../.ivy2/local/com.github.serceman/jnr-fuse/0.1/ivys/ivy.xml
[warn] ==== public: tried
[warn]   http://repo1.maven.org/maven2/com/github/serceman/jnr-fuse/0.1/jnr-fuse-0.1.pom
[info] Resolving jline#jline;2.12.1 ...
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: com.github.serceman#jnr-fuse;0.1: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
sbt.ResolveException: unresolved dependency: com.github.serceman#jnr-fuse;0.1: not found
at sbt.IvyActions$.sbt$IvyActions$$resolve(IvyActions.scala:213)
at sbt.IvyActions$$anonfun$update$1.apply(IvyActions.scala:122)
at sbt.IvyActions$$anonfun$update$1.apply(IvyActions.scala:121)
[ ... truncated ... ]

Редактировать (относительно зависимости от jcenter)

Добавьте следующую строку в ваш build.sbt (запомните лишнюю пустую строку)

resolvers += Resolver.jcenterRepo

чтобы добавить jcenter в ваш список решателей.

Редактировать 2

Resolver.jcenterRepo недоступен в SBT 0.13.5, поэтому

resolvers += "jcenter" at "https://jcenter.bintray.com/"

необходимо.

После успешной компиляции и запуска появляется соответствующая ошибка

java.lang.RuntimeException: java.lang.NoClassDefFoundError: jnr/ffi/provider/jffi/NativeClosureProxy
at jnr.ffi.provider.jffi.NativeClosureProxy.newProxyFactory(NativeClosureProxy.java:220)

Конечный результат

Библиотека "com.github.serceman" в версии 0.1 кажется проблематичной, так как она не может должным образом создать экземпляр класса с помощью отражения.

Решение

Проблема решена путем добавления fork in run := true в build.sbt,

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