2011-12-15 8 views
9

Ho una piccola applicazione con RemoteActors e voglio creare un file jar da esso. Quando provo ad eseguirlo ottiene questa eccezione:NoClassDefFoundError quando si esegue il file 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 

Ho incluso scala-library.jar nel mio file jar, ed è nel classpath. Altrimenti java si fermerebbe a cercare la classe ScalaObject.

+0

Altre informazioni di runtime sarebbero buone. Stai cercando di costruire un barattolo con Maven? O eseguirlo con Eclipse? – hellectronic

+1

Come minimo, mostra la riga di comando che hai richiamato e menziona quale versione di Scala stai usando. – retronym

+0

il comando: java -jar myjar.jar Sto usando scala 2.7.7 finale – laci37

risposta

1

Il problema era una mancata corrispondenza della versione tra il plugin Scala su Eclipse e la versione di Scala installata. attori/Combinators.scala è apparso in 2.8 e il plugin Eclipse era 2.8 ma ho incluso 2.7.7 scala-library.jar

4

Java non gestisce "vaso all'interno di un barattolo". Il classloader predefinito non può caricare le classi in questo modo.

Dal tuo stacktrace, sembra che tu abbia usato il jar eseguibile-> java-> eseguibile di eclipse. Dovrebbe includere uno speciale classloader che gestisce il caricamento di jar nel jar ma sembra non funzionare.

Immagino che qualcosa sia andato storto nel costruire il barattolo o che sia confuso da scala sia incluso nel tuo jar e nel tuo classpath. Puoi provare di nuovo usando "estrai librerie in jar" piuttosto che "librerie di pacchetti in jar". Puoi provarlo senza scala sul classpath.

In mancanza di ciò ci sono altre opzioni se si vuole un unico barattolo Disponibile per la spedizione:

  • È possibile decomprimere tutti i vasi si dipende e repack con i tuoi classi compilate (dovrebbe essere quello che "estrarre" fa sopra). Il plugin shade di Maven può essere d'aiuto.

  • è possibile utilizzare una soluzione diversa in grado di fornire un'implementazione di caricamento classe in grado di caricare vasetti nidificati, come OneJar

Spero che questo è utile, se avete bisogno di più aiuto necessario per descrivere esattamente ciò che si passi prendere per produrre questo barattolo, e probabilmente l'output di "jar tvf myjar.jar" aiuterà anche.

+0

Ho provato ad estrarre la libreria scala nel file jar ma il risultato è la stessa eccezione. Sembra che non ci sia scala.actors.Combinatori di classe in scala-library.jar – laci37

+0

Puoi eseguire "jar tvf myjar.jar" e assicurarti che lo scala-lang sia mostrato come se fosse lì dentro? In questo caso, estrai (jar xvf) myjar.jar in una cartella temporanea e poi ispeziona lo scala-lang.jar che è presente allo stesso modo? –

+0

jar tvf ping.jar | grep scala-lang non mostra risultati. Ho estratto il barattolo e non ho trovato alcun file chiamato scala-lang. – laci37

Problemi correlati