2011-12-15 17 views
9

Tengo una pequeña aplicación con RemoteActors, y quiero crear un archivo jar a partir de ella. Cuando trato de ejecutarlo se pone esta excepción:NoClassDefFoundError al ejecutar el archivo jar de 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 

He incluido scala-library.jar en mi archivo JAR, y se encuentra en la ruta de clase. De lo contrario, java se detendría al encontrar la clase ScalaObject.

+0

Más información sobre el tiempo de ejecución sería bueno. ¿Estás tratando de construir una jarra con Maven? ¿O simplemente ejecutarlo con Eclipse? – hellectronic

+1

Como mínimo, muestre la línea de comando que ha invocado y mencione qué versión de Scala está utilizando. – retronym

+0

el comando: java -jar myjar.jar Estoy usando scala 2.7.7 final – laci37

Respuesta

1

El problema era una discrepancia de versión entre el complemento de Scala en Eclipse y la versión de Scala instalada. actors/Combinators.scala apareció en 2.8, y el plugin de Eclipse fue 2.8, sin embargo, incluí 2.7.7 scala-library.jar

4

Java no maneja "jar dentro de un contenedor". El cargador de clases predeterminado no puede cargar clases de esa manera.

Desde tu stacktrace, parece que has usado eclipse's export-> java-> jar ejecutable. Se supone que debe incluir un cargador de clases especial que maneja el jar en la carga jar pero parece que no funciona.

Supongo que algo salió mal construyendo el contenedor o se confunde al incluir scala en tu jar y classpath. Puede intentar esto de nuevo usando "extraer bibliotecas en el contenedor" en lugar de "bibliotecas de paquetes en el contenedor". Podrías probarlo sin scala en el classpath.

De no ser así, hay otras opciones si quieres un frasco único entregable:

  • Puede descomprimir todos los frascos de los que depende, y recargando con sus clases compiladas (debe ser lo "extraer" hace encima). El complemento shade de Maven puede ayudar con esto.

  • Se puede utilizar una solución diferente que proporcionará una implementación de cargador de clases que se pueden cargar frascos anidados, como OneJar

Hope esto es útil, si necesita más ayuda que necesita para describir exactamente lo que los pasos tomar para producir este jar, y probablemente la salida de "jar tvf myjar.jar" ayudará también.

+0

Intenté extraer la biblioteca scala al archivo jar pero el resultado es la misma excepción. Parece que no hay clase scala.actors.Combinators en scala-library.jar – laci37

+0

¿Se puede ejecutar "jar tvf myjar.jar" y asegurarse de que Scala-lang se muestra como allí? Si ese es el caso, extraiga (jar xvf) myjar.jar en una carpeta temporal y luego inspeccione el scala-lang.jar que está presente de la misma manera? –

+0

jar tvf ping.jar | grep scala-lang no muestra resultados. Extraje el contenedor y no encontré ningún archivo llamado scala-lang. – laci37

Cuestiones relacionadas