NoClassDefFoundError при запуске jar-файла Scala - PullRequest
9 голосов
/ 16 декабря 2011

У меня есть небольшое приложение с RemoteActors, и я хочу сделать из него файл jar. Когда я пытаюсь выполнить его, он получает это исключение:

Exception in thread "main" java.lang.reflect.InvocationTargetException
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:616)
  at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NoClassDefFoundError: scala/actors/Combinators
  at pingpong.PingApp$.main(PingApp.scala:5)
  at pingpong.PingApp.main(PingApp.scala)
  at pingpong.ScalaEntryPoint.main(ScalaEntryPoint.java:5)
  ... 5 more
Caused by: java.lang.ClassNotFoundException: scala.actors.Combinators
  at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
  ... 8 more

Я включил scala-library.jar в мой файл jar, и он находится в пути к классам. В противном случае Java остановится на поиске класса ScalaObject.

Ответы [ 2 ]

5 голосов
/ 17 декабря 2011

Java не обрабатывает "банку в банке". Загрузчик классов по умолчанию не может загружать классы таким образом.

Из вашей трассировки стека похоже, что вы использовали eclipse export-> java-> runnable jar. Предполагается включить специальный загрузчик классов, который обрабатывает jar при загрузке jar, но, похоже, он не работает.

Я бы предположил, что что-то пошло не так, когда он строит банку, или это сбивает с толку скала, включенная в вашу банку и в ваш путь к классам. Вы можете попробовать это снова, используя «извлечь библиотеки в jar», а не «упаковать библиотеки в jar». Вы можете попробовать это без скала на пути к классам.

В случае отсутствия других опций, если вы хотите одну отправляемую банку:

  • Вы можете распаковать все банки, от которых вы зависите, и перепаковать их с вашими скомпилированными классами (должно быть то, что «извлечение» делает выше). В этом может помочь плагин Maven shade .

  • Вы можете использовать другое решение, которое предоставит реализацию загрузчика классов, которая может загружать вложенные банки, например OneJar

Надеюсь, что это полезно, если вам нужна дополнительная помощь, вам нужно точно описать, какие шаги вы предпринимаете для создания этого jar-файла, и, вероятно, вывод "jar tvf myjar.jar" тоже поможет.

1 голос
/ 22 декабря 2011

Проблема заключалась в несоответствии версий плагина Scala на Eclipse и установленной версии Scala. ctors / Combinators.scala появился в 2.8, а плагин Eclipse был 2.8, но я включил 2.7.7 scala-library.jar

...