2011-12-15 12 views
9

Mam małą aplikację z RemoteActors, i chcę utworzyć plik jar z niego. Gdy próbuję go uruchomić robi to wyjątek:NoClassDefFoundError podczas uruchamiania pliku JAR Scala

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 

mam włączone scala-library.jar w moim pliku jar, i to jest w ścieżce klasy. W przeciwnym razie java przestałby znajdować klasę ScalaObject.

+0

Więcej informacji o czasie działania byłoby dobre. Próbujesz zbudować słoik z Mavenem? Lub po prostu uruchamianie go w Eclipse? – hellectronic

+1

Jako minimum wyświetl wiersz polecenia, który wywołałeś, i podaj nazwę używanej wersji Scala. – retronym

+0

polecenie: java -jar myjar.jar Używam scala 2.7.7 final – laci37

Odpowiedz

1

Problem polegał na niezgodności wersji między wtyczką Scala w Eclipse i zainstalowaną wersją Scala. Aktorzy/Combinators.scala pojawili się w wersji 2.8, a wtyczka Eclipse 2.8. Dołączono 2.7.7 scala-library.jar

4

Java nie obsługuje "słoika w słoiku". Domyślny program ładujący klasy nie może załadować klas w ten sposób.

Z twojego stacktrace wygląda na to, że użyłeś eclipse's export-> java-> runnable jar. Ma on zawierać specjalny moduł ładujący klasy, który obsługuje ładowanie słoika w słoiku, ale wygląda na to, że nie działa.

Zgaduję, że coś poszło nie tak, budując słoik, lub jest zdezorientowany przez scala, która jest zawarta w twoim słoiku i w ścieżce klasowej. Możesz spróbować tego ponownie, używając "bibliotek ekstraktów w słoiku" zamiast "bibliotek pakietów w słoiku". Możesz spróbować bez scala w ścieżce klas.

przeciwnym razie, że istnieją inne opcje, jeśli chcesz pojedynczy shippable słoika:

  • można rozpakować wszystkie słoików zależą od i zapakować je z skompilowanych klas (powinien być co „wyciąg” robi powyżej). Wtyczka Maven shade może w tym pomóc.

  • Można użyć innego rozwiązania, które zapewni implementację classloader, które można załadować zagnieżdżonych słoiki, jak OneJar

nadzieję, że ta jest przydatna, jeśli potrzebujesz więcej pomocy trzeba opisać dokładnie, jakie kroki wziąć ten słoik i prawdopodobnie wyjście "jar tvf myjar.jar" też pomoże.

+0

Próbowałem wyodrębnić bibliotekę scala do pliku JAR, ale wynik jest tym samym wyjątkiem. Wygląda na to, że nie ma klasy scala.actors.Combinators w scala-library.jar. – laci37

+0

Czy możesz uruchomić "jar tvf myjar.jar" i upewnić się, że scala-lang jest pokazany jako tam? Jeśli tak jest, wyodrębnij (jar xvf) myjar.jar do folderu tymczasowego, a następnie sprawdź plik scala-lang.jar, który jest obecny w ten sam sposób? –

+0

jar tvf ping.jar | grep scala-lang nie wyświetla żadnych wyników. Wyjąłem słoik i nie znalazłem żadnego pliku o nazwie scala-lang. – laci37

Powiązane problemy