2016-12-25 2 views
4

Я новичок в JVM land, поэтому прошу прощения, если это распространенная проблема. Я использую Scala (2.12) с sbt 0.13.13 на OSX.NoClassDefFoundError с sbt и scala.swing

Я работаю над крошечным приложением, которое зависит от библиотеки GUI scala.swing (2.10.x). Я сразу же столкнулся с проблемой выполнения с кодом примера (http://otfried.org/scala/index_28.html).

В частности, при вызове sbt run я получаю StackTrace ведущий с:

[error] (run-main-0) java.lang.NoClassDefFoundError: scala/Proxy$class 
java.lang.NoClassDefFoundError: scala/Proxy$class 
    at scala.swing.Window.<init>(Window.scala:25) 
    at scala.swing.Frame.<init>(RichWindow.scala:75) 
    at scala.swing.MainFrame.<init>(MainFrame.scala:19) 

(Proxy, кажется, класс/черта в лестницу STDLIB)

Чтение на SO и в других местах предполагает такого рода исключение обычно испускается, когда код, присутствующий во время компиляции, не может быть впоследствии обнаружен во время выполнения. Действительно, код компилируется просто отлично, только при запуске кода возникает проблема.

Все предложения, которые я нашел, это согласование classpath для решения этих проблем. Тем не менее, если консоль sbt это верить, мое время компиляции и время выполнения пути к классам идентичны:

> show compile:fullClasspath 
[info] * Attributed(/Users/chris/Projects/thing2/target/scala-2.12/classes) 
[info] * Attributed(/Users/chris/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.1.jar) 
[info] * Attributed(/Users/chris/.ivy2/cache/org.scala-lang/scala-swing/jars/scala-swing-2.10.6.jar) 
[success] Total time: 0 s, completed Dec 24, 2016 7:01:15 PM 
> show runtime:fullClasspath 
[info] * Attributed(/Users/chris/Projects/thing2/target/scala-2.12/classes) 
[info] * Attributed(/Users/chris/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.1.jar) 
[info] * Attributed(/Users/chris/.ivy2/cache/org.scala-lang/scala-swing/jars/scala-swing-2.10.6.jar) 
[success] Total time: 0 s, completed Dec 24, 2016 7:01:19 PM 

Итак, я нахожусь в немного судебно тупиковой. Любые предложения о том, где искать следующий, будут высоко оценены. Для ясности это произошло только с scala.swing. У меня есть еще несколько небольших проектов в Scala, у которых не было никаких проблем. Что озадачивает «отсутствующий» класс, кажется, является стандартным материалом scala scala.

+0

Если вы пытаетесь использовать версию 2.10.x 'scala.swing' с Scala 2.12, то проблема, вероятно, связана с несовместимыми версиями. Используйте версию 2.12 'scala.swing' –

+0

Я думаю, что большинство библиотек Scala не имеют обратной или прямой совместимости –

+1

2.10.x относится к внутреннему управлению версиями' scala.swing', я думаю. Документы на https://github.com/scala/scala-swing указывают, что ветка swing 2.x является правильной для использования в scala. 2.12. – cmw

ответ

7

NoClassDefFoundError указывает на проблему, когда вы смешиваете библиотеки, которые были скомпилированы для разных основных версий Scala. Если вы используете Scala 2.12, вы также должны использовать модуль Swing с соответствующей версией. До Scala 2.11, Swing была опубликована с артефактом, как это:

"org.scala-lang" % "scala-swing" % scalaVersion.value 

Он был затем переехал в org.scala-lang.modules группу. Файл сборки должен содержать что-то вроде этого:

scalaVersion := "2.12.1" 

libraryDependencies += "org.scala-lang.modules" %% "scala-swing" % "2.0.0-M2" 

(это, кажется, последняя Scala 2.11 совместимая версия "1.0.2" не была опубликована в Scala 2.12, и поэтому вам нужно перейти прямо к "2.0.0-M2", который должен быть главным источником совместимый) ,

+0

Я забыл указать в моем исходном вопросе, что я иметь правильную ветвь swing, указанную в моей 'built.sbt' для Scala 2.12. (качели указаны на 2.10+) – cmw

+0

Нет 2.10+, что верно для Scala 2.12. Вы смешиваете его с ветвью 2.0.x, для которой я привел артефакт выше. –

Смежные вопросы