java.lang.UnsupportedClassVersionError: ¿Número de versión incorrecto en el archivo .class?

140

Recibo este error cuando incluyo una biblioteca de código abierto que tuve que compilar desde el origen. Ahora, todas las sugerencias en la web indican que el código se compiló en una versión y se ejecutó en otra versión (nuevo en antiguo). Sin embargo, solo tengo una versión de JRE en mi sistema. Si ejecuto los comandos:

$ javac -version
javac 1.5.0_18

$ java -version
java version "1.5.0_18"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_18-b02)
Java HotSpot(TM) Server VM (build 1.5.0_18-b02, mixed mode)

y compruebo en Eclipse las propiedades de la biblioteca de Java, obtengo 1.5.0_18

Por lo tanto, tengo que concluir que algo más, interno de una clase en sí misma, es lanzar la excepción. ¿Es eso posible?

grmn.bob
fuente
2
¿tiene una versión compilada de la biblioteca en otro lugar que podría estar en su classpath primero?
Jeff Storey
Buena idea, pero no. Hice una comprobación usando 'find. -nombre '* .jar' | xargs localizar 'desde la carpeta lib con los JAR. Además, ¿no pensé que Eclipse usaba CLASSPATH? ¿Alguna otra buena sugerencia?
grmn.bob
cómo usar este comando find -name '* .jar' en cmd ya que estoy buscando reconstruir el código jre src nuevamente ... y para eso necesito activar este cmd ..... javalobby.org/java/forums /t103334.html.....my jdk está en C: \ Archivos de programa \ Java \ jdk1.6.0_31
Estudiante

Respuestas:

185

Aprendí que los mensajes de error como este suelen ser correctos. Cuando POSIBLEMENTE (en su opinión) no puede ser lo que dice el error que se informa, busca un problema en otra área ... solo para descubrir horas después que el mensaje de error original era correcto.

Dado que está utilizando Eclipse, creo que Thilo tiene razón. La razón más probable por la que recibe este mensaje es porque uno de sus proyectos está compilando 1.6 clases. No importa si solo tiene un 1.5 JRE en el sistema, porque Eclipse tiene su propio compilador (no javac), y solo necesita un 1.5 JRE para compilar 1.6 clases. Puede ser extraño, y una configuración debe estar desmarcada para permitir esto, pero solo logré hacerlo.

Para el proyecto en cuestión, verifique las Propiedades del proyecto (generalmente Alt + Intro), sección Compilador Java. Aquí hay una imagen de un proyecto configurado para compilar 1.6, pero con solo un 1.5 JRE.

ingrese la descripción de la imagen aquí

Joshua McKinnon
fuente
Totalmente de acuerdo ... es por eso que pregunté, en mi comentario, la pregunta de formas precisas. No conocía las clases internas de Eclipse. La biblioteca fue compilada en la línea de comando con 'javac' e integrada en mi proyecto Eclipse. Intentaré compilar mi proyecto desde la línea de comandos. Claramente has resuelto este problema en el pasado y tus sugerencias son fantásticas.
grmn.bob
3
Si tiene el JDK (que tiene fuentes), debería poder agregar algunos puntos de interrupción en Eclipse y, con suerte, ver qué clase está intentando cargar. La forma más fácil es probablemente un punto de interrupción en el constructor de UnsupportedClassVersionError (o un punto de interrupción de Eclipse Exception, el icono 'J!'), Luego puede inspeccionar cómo llegó allí.
Joshua McKinnon
OKAY. Encontré un experto en el edificio y pudo señalar a Eclipse al mismo JRE que mi línea de comando. Luego reconstruí contra 1.6 y corrí contra 1.6 y todo funciona. Obviamente, me equivoqué al no tener nada más que 1.5. Me mostró dónde mirar. Gracias por la ayuda, ahora estoy con mi próximo problema. :)
grmn.bob
2
Tuve el mismo problema. El error que cometí fue que estaba usando 1.5 JRE y 1.6 compilador. Lo que no resolvió el error de conversión de clase no compatible. Así que instalé el 1.6 JRE en mi eclipse y utilicé el compilador 1.6. Entonces todo comenzó a funcionar bien.
Vanchinathan Chandrasekaran
1
Quiero votar esto por segunda vez, porque es la segunda vez que tengo el problema, busco, encuentro esta respuesta, y ha sido correcto. > _ <
AlbeyAmakiir
9

¿Has intentado hacer una "limpieza" completa y luego reconstruir en Eclipse (Proyecto-> Limpiar ...)?

¿Eres capaz de compilar y ejecutar con "javac" y "java" directamente desde la línea de comandos? ¿Eso funciona correctamente?

Si hace clic con el botón derecho en su proyecto, vaya a "Propiedades" y luego a "Java Build Path", ¿hay alguna entrada sospechosa debajo de alguna de las pestañas? Este es esencialmente tu CLASSPATH.

En las preferencias de Eclipse, también puede verificar la sección "JRE instalados" en la sección "Java" y asegurarse de que coincida con lo que cree que debería.

Definitivamente tiene un archivo .class obsoleto en algún lugar o está obteniendo una falta de coincidencia en tiempo de compilación / tiempo de ejecución en las versiones de Java que está utilizando.

Brent escribe el código
fuente
sí (limpieza completa); no lo he probado (proyecto desde la línea cmd); quizás / no (eliminé entradas de Eclipse "Java Build Path"); hice eso (JREs - ahí es donde obtuve la versión #).
grmn.bob
5

¿Compiló con Eclipse? Utiliza un compilador diferente (no javac). Eso no debería dar lugar a este error (si todo está configurado correctamente), pero puede intentar compilarlo con javac.

Si eso solucionó el problema, intente ver si Eclipse tiene alguna configuración incorrecta del compilador. Específicamente, apunte a Java 5.

Thilo
fuente
Eso es lo que estoy aprendiendo. Voy a intentar construir las dos piezas de la misma manera (línea de cmd y / o eclipse).
grmn.bob
1
Gracias Thilo, he aprendido mucho hoy sobre Eclipse y Java y las versiones de clase. Y un poco sobre hormiga también.
grmn.bob
2

También recibí el mismo error. Razón por la que estaba compilando el proyecto usando Maven. Tenía JAVA_HOME apuntando a JDK7 y, por lo tanto, java 1.7 se estaba utilizando para la compilación y al ejecutar el proyecto estaba usando JDK1.5. Cambiar la entrada a continuación en el archivo .classpath o cambiar en el eclipse como en la captura de pantalla resolvió el problema.

classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5

o cambiar en la configuración de ejecución de eclipse como ingrese la descripción de la imagen aquí

Vikky
fuente
1

También verifique cualquier archivo jar en su proyecto que haya sido compilado para una versión superior de Java. Si estas son sus propias bibliotecas, puede solucionar esto cambiando el atributo de la versión de destino a javac

<javac destdir="${classes.dir}"
            debug="on" classpathref="project.classpath" target="1.6">
Jeshurun
fuente
0

Otro escenario en el que esto podría suceder es cuando está iniciando una instancia de eclipse (para depuración, etc.) desde un eclipse de host, en cuyo caso, alterar el nivel del proyecto o la biblioteca JRE en el classpath del proyecto solo no ayuda. Lo que importa es el JRE utilizado para lanzar el entorno de eclipse de destino.

Arrendajo
fuente
0

Siempre revise lo obvio también. Recibí este error una vez cuando accidentalmente tomé el recurso incorrecto para la acción de agregar y quitar del servidor. Puede ser fácil pasarlo por alto.

James Drinkard
fuente
0

También eliminará los archivos de configuración específicos del proyecto (Eclipse workspace / project folder / .settings /) de la carpeta del proyecto. Obviamente, necesitamos limpiar y construir un proyecto después de eliminarlo.

usuario3471219
fuente
0

cambiando el proyecto para usar java 1.7: para que esto funcione, siga estos pasos:

  • Cambiar el nivel de cumplimiento del compilador
  • Cambie sus proyectos JRE / JDK a algo del mismo nivel (1.7 en mi caso)
  • Haga el mismo cambio en todos los proyectos a los que hace referencia su proyecto
  • Cambie su configuración de ejecución / depuración para usar JRE / JDK (o del mismo nivel)

¿No funciona?

  • eliminar proyectos del directorio Bin
  • Limpiar
  • reconstruir

¿Sigue sin funcionar?

en el directorio de su proyecto: edite .settings / org.eclipse.jdt.core.prefs> asegúrese de que se aplica su nivel objetivo

¡Buena suerte!

Li3ro
fuente
0

Resolví este problema cambiando jre requerido para el servidor (en mi caso es tomcat). Desde la pestaña Servidor en eclipse, haga doble clic en el servidor (para abrir la página para la configuración del servidor), haga clic en Entorno de tiempo de ejecución, luego cambie JRE requerido

ocrampico
fuente