2011-12-22 14 views
7

¿Qué es java.lang.UnsupportedClassVersionError?¿Qué es java.lang.UnsupportedClassVersionError?

que he leído de la doc: lanza cuando la Máquina Virtual de Java intenta leer un archivo de clase y determina que los mayores y menores números de versión del archivo no son compatibles, pero no podía entender lo que significa eso.

¿Cuáles son las versiones mayores y menores en el archivo?

puse en marcha una aplicación en la máquina de alguien más cuando la siguiente excepción fue arrojado:

Exception in thread "main" java.lang.UnsupportedClassVersionError: client (Unsupported major.minor version 51.0) 
    at java.lang.ClassLoader.defineClass0(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:539) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:251) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:55) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:194) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:187) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:289) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:235) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302) 

aunque funcionó bien en mi máquina.

Respuesta

10

Las diferentes versiones del compilador JDK generan diferentes versiones de clase. Por ejemplo, Java 1.4 genera 48.0, 1.5 genera 49.0 y 1.6 50.0.

Una JVM generalmente puede cargar clases de JVM "menores" que ella, pero nunca mayores. Probablemente estés tratando de usar una clase compilada para 1.6 en una JVM 1.5, o similar.

Una buena herramienta para encontrar versiones de clase es bcel si usted está interesado. En particular, tiene un buen conjunto de tareas ant.

+0

'javap' (desensamblador incorporado en java) se puede utilizar para verificar la versión mayor y menor. BCEL sería más apropiado si desea hacer esta verificación de versión mediante programación. – peakit

3

Eso significa que la versión del compilador es más reciente que la versión jvm donde intenta ejecutar las clases. Reduzca el compilador de java de su máquina o actualice el jvm de tiempo de ejecución de la otra máquina.

+1

Hay una tercera opción (para la mayoría de los compiladores de Java). Puede hacer algo como 'javac -target 1.1' que, a partir de un compilador moderno, producirá un bytecode adecuado para una antigua JVM. No hay necesidad de degradar el compilador en realidad. – emory

+0

@ emory ¿qué significa '1.1'? –

+1

@SuhailGupta En mi ejemplo, tengo un compilador de 1.7 pero quiero usar el bytecode en una JVM 1.1. Lo más probable es que tengas un compilador 1.6 pero quieras usar el código de bytes en una JVM 1.5 (como en http://stackoverflow.com/a/8605030/348975) - entonces usarías 'javac -target 1.5' – emory

Cuestiones relacionadas