org - Cómo arreglar java.lang.UnsupportedClassVersionError: Versión major.minor no soportada
unsupported major.minor version 51.0 maven (30)
Estoy tratando de usar Notepad++ como mi herramienta todo en uno para editar, ejecutar, compilar, etc.
Tengo instalado JRE y he configurado mi variable de ruta al directorio ... / bin.
Cuando ejecuto mi "Hola mundo" en Notepad ++, recibo este mensaje:
java.lang.UnsupportedClassVersionError: test_hello_world :
Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
.........................................
Creo que el problema aquí es sobre las versiones; Algunas versiones de Java pueden ser antiguas o demasiado nuevas.
- ¿Cómo lo arreglo?
- ¿Debo instalar el JDK y configurar mi variable de ruta al JDK en lugar de JRE?
- ¿Cuál es la diferencia entre la variable
PATH
en JRE o JDK?
¿Cómo lo arreglo?
Este error significa que el JRE que se está utilizando para ejecutar su código de clase no reconoce la versión de Java utilizada. Generalmente, porque la versión de Java que generó su archivo de clase (es decir, lo compiló) es más reciente.
Para arreglarlo, puedes o bien
a) Compile sus fuentes Java con la misma versión del compilador Java, o una versión más antigua, que se utilizará para ejecutarlo. Es decir, instalar el JDK apropiado.
b) Compile sus fuentes Java con la versión más reciente del compilador de Java pero en modo de compatibilidad. es decir, utilizar el parámetro -target
.
c) Ejecute sus clases compiladas en un JRE que sea la misma versión, o la más nueva, que el JDK utilizado para compilar las clases.
Puede verificar las versiones que está utilizando actualmente con javac -version
para el compilador, y java -version
para el tiempo de ejecución.
¿Debo instalar el JDK y configurar mi variable PATH en el JDK en lugar de JRE?
Para la compilación, ciertamente, instale y configure el JDK específico que desee.
Para el tiempo de ejecución, puede usar el que viene con el JDK o un JRE independiente, pero, independientemente de eso, asegúrese de que haya instalado las versiones correctas y que haya configurado su PATH para que no haya sorpresas.
¿Cuál es la diferencia entre la variable PATH en JRE o JDK?
La variable de entorno PATH le dice al comando shell dónde buscar el comando que escribe. Cuando escribe java
, el intérprete de shell de comandos buscará en todas las ubicaciones especificadas en la variable PATH
, de izquierda a derecha, para encontrar el ejecutable de tiempo de ejecución java
adecuado para ejecutar. Si tiene varias versiones de Java instaladas, es decir, tiene el ejecutable java
en varias ubicaciones especificadas en la variable PATH, entonces la primera que se encuentre cuando vaya de izquierda a derecha será la que se ejecute.
El comando del compilador es javac
y solo viene con el JDK. El comando de tiempo de ejecución es java
y viene con el JDK y está en el JRE.
Es probable que tenga una versión (51.0 = Java 7) de javac
instalada y que también tenga instalada la misma versión de java
, pero que otra versión anterior de java
aparezca anteriormente en la RUTA y que se invoque en lugar de la versión anterior. uno que esperas.
Basado en esto...
J2SE 8 = 52
J2SE 7 = 51
J2SE 6.0 = 50
J2SE 5.0 = 49
JDK 1.4 = 48
JDK 1.3 = 47
JDK 1.2 = 46
JDK 1.1 = 45
En Eclipse, haga clic derecho en el proyecto en el explorador de paquetes:
Ruta de compilación -> Configurar ruta de compilación
Debajo:
Ruta de compilación de Java -> Bibliotecas -> Agregar biblioteca -> Biblioteca del sistema JRE -> JRE instalados -> Buscar .
Agregue el JRE requerido seleccionando la biblioteca en la lista disponible después de que se complete la búsqueda.
Como varias personas respondieron en otra parte, el programa Java se ejecuta en una versión más antigua de Java de la que fue compilada. Debe estar "compilado de forma cruzada" para la compatibilidad con versiones anteriores. Para decirlo de otra manera, existe una discrepancia entre las versiones de origen y destino de Java.
El cambio de opciones en los menús de Eclipse no responde al póster original, quien dijo que no está utilizando Eclipse. En OpenJDK javac versión 1.7, puede realizar una compilación cruzada de 1.6 si usa los parámetros -source
y -source
, además de proporcionar el archivo rt.jar de la versión de destino (es decir, la más antigua) en tiempo de compilación. Si realmente instala 1.6 JRE, puede apuntar a su instalación (por ejemplo, /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar en Ubuntu, / usr / jdk / jdk1. 6.0_60 / jre / lib / rt.jar en SunOS aparentemente. Lo siento, no sé dónde está en un sistema Windows). Al igual que:
javac -source 1.6 -target 1.6 -bootclasspath /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar HelloWorld.java
Parece que solo puedes descargar rt.jar desde Internet y señalarlo. Esto no es demasiado elegante aunque
javac -source 1.6 -target 1.6 -bootclasspath ./rt.jar HelloWorld.java
Cuando instalé JDK 1.7, el problema se resolvió.
El número de versión que se muestra describe la versión del JRE con el que es compatible el archivo de clase.
Los principales números reportados son:
Java SE 11 = 55,
Java SE 10 = 54,
Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45
(Fuente: Wikipedia )
Para solucionar el problema real, debe intentar ejecutar el código Java con una versión más nueva de Java JRE o especificar el parámetro de destino en el compilador de Java para que el compilador cree un código compatible con versiones anteriores de Java.
Por ejemplo, para generar archivos de clase compatibles con Java 1.4, use la siguiente línea de comando:
javac -target 1.4 HelloWorld.java
Con las versiones más recientes del compilador de Java es probable que reciba una advertencia sobre la ruta de la clase bootstrap que no se está configurando. Más información sobre este error está disponible en la publicación del blog New javac warning para configurar una fuente anterior sin bootclasspath .
El problema más común es la mala configuración de su variable JAVA_HOME
, que debería apuntar a la biblioteca correcta del kit de desarrollo de Java, si tiene varios instalados.
Para encontrar la ubicación de la carpeta Java del SDK, ejecute los siguientes comandos:
jrunscript -e ''java.lang.System.out.println(java.lang.System.getProperty("java.home"));''
Debian / Ubuntu
Para comprobar qué java (openjdk) has instalado, consulta a través de:
dpkg -l "openjdk*" | grep ^i
o:
update-java-alternatives -l
Para cambiarlo, usa:
update-alternatives --config java
Prefijo con sudo
si es necesario.
para seleccionar la versión java alternativa.
O compruebe cuáles están disponibles para instalar:
apt-cache search ^openjdk
Prefijo con sudo
si es necesario.
Luego puedes instalar, por ejemplo:
apt-get install openjdk-7-jre
Prefijo con sudo
si es necesario.
Fedora, Oracle Linux, Red Hat
Instalar / actualizar el paquete apropiado a través de:
yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel
El paquete
java-1.7.0-openjdk
contiene solo el entorno de ejecución de Java. Si desea desarrollar programas Java, instale el paquetejava-1.7.0-openjdk-devel
.
BSD
Hay un paquete OpenJDK 7 en la colección de Puertos de FreeBSD llamado openjdk7 que probablemente deba reconfigurarse.
Ver: página wiki OpenJDK .
Windows
Simplemente instale la biblioteca apropiada de Java SE Development Kit desde el sitio de Oracle o instálela
Jenkins
Si está experimentando este problema con Jenkins, vea:
Sin embargo, la selección de la versión correcta de Java (más reciente) con update-alternatives
debería funcionar.
En Eclipse, simplemente fui al comando de menú Ventana -> Preferencias -> Java -> Compilador y luego configuré "Nivel de cumplimiento del compilador" en 1.6.
En la ventana del menú de Eclipse -> Preferencias -> Java -> Verificación del compilador también "Configurar ajustes específicos del proyecto".
Si aún tiene el error con la misma versión de Java: intente eliminar la carpeta de compilación de su proyecto manualmente. Luego reinicie Eclipse.
Está intentando ejecutar su programa con una versión de Java que no admite la versión en la que se compiló el código. Básicamente, debe haber compilado su código con una versión superior e intentar ejecutarlo utilizando una versión inferior.
Como estas recibiendo
Unsupported major.minor version 51.0
y la versión 51.0 corresponde a J2SE 7, lo más probable es que haya compilado su código en Java 7 y trate de ejecutarlo usando una versión inferior. Compruebe lo que muestra java -version
. Debe ser la versión de Java 7. Si no, haz los cambios apropiados en el PATH / JAVA_HOME. O puede compilar con la misma versión que intenta ejecutar el código. Si las configuraciones son confusas, siempre puede dar la ruta absoluta /home/user/jdk1.7.0_11/bin/javac
y /home/user/jdk1.7.0_11/bin/java
.
Este error significa que está intentando cargar un archivo de "clase" de Java que se compiló con una versión más nueva de Java que la que ha instalado.
Por ejemplo, su archivo .class
podría haber sido compilado para JDK 7, y está intentando ejecutarlo con JDK 6.
Entonces la solución es:
- Actualice su tiempo de ejecución de Java o
Vuelva a compilar la clase si tiene la fuente, usando su compilador local de Java (si tiene uno).
javac FileName.java
Para los desarrolladores, esto puede suceder si otro desarrollador comprueba en un archivo .class, ¡y tienen una versión más nueva de Java que la que usted tiene!
Ha compilado su clase Java con JDK 7 y está intentando ejecutar la misma clase en JDK 6.
Ha utilizado una versión superior del JDK para compilar e intentar ejecutar desde una versión inferior de JDK / JRE .
Para verificar esto, vea la información de la versión:
javac -version
java -version
Serán diferentes y javac tendrá un número de versión más alto.
Para solucionar esto, ejecute java desde la versión JDK o si tiene un JRE / JDK más reciente que también funcionará.
which javac
le dirá la ubicación, por ejemplo, /usr/bin/javac
. Simplemente ejecute directamente usando /usr/bin/java <program>
.
O puede establecer la variable de entorno como una solución permanente.
Hoy, este mensaje de error apareció en nuestro Tomcat 7 en Ubuntu 12.04.2 LTS (Precise Pangolin):
/var/log/tomcat7/localhost.2014-04-08.log:
8 de abril de 2014 09:00:55 AM org.apache.catalina.core.StandardContext filterStart
SEVERO: Excepción de arranque del filtro struts2
java.lang.UnsupportedClassVersionError: controller / ReqAccept: major.minor no admitido versión 51.0 (no se puede cargar la clase controller.ReqAccept)
La aplicación Struts está compilada con Java 7.
Resultó que alguien usa "service tomcat [stop / start]" para reiniciar Tomcat 7,
$ ps -ef | grep java
tomcat7 31783 1 32 20:13? 00:00:03 / usr / lib / jvm / default-java / bin / java ...
$ / usr / lib / jvm / default-java / bin / java -version
Versión de Java "1.6.0_27"
Lo que provoca el error "No se admite major.minor versión 51.0".
Cuando usamos "/etc/init.d/tomcat7 [stop / start]" para reiniciar Tomcat 7, el problema se resolvió.
$ ps -ef | grep java
tomcat7 31886 1 80 20:24? 00:00:10 /usr/local/java/jdk1.7.0_15/bin/java
$ /usr/local/java/jdk1.7.0_15/bin/java -version
versión java "1.7.0_15"
Lo resolví. Corrí:
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
El error es engañoso, Unsupported major.minor version 51.0
. Esto da la impresión de que la versión 51 (Java 7) no es compatible. Y deberíamos usar Java 6.
El error debería haber sido:
La versión actual de Java, 50, no es compatible. Use la versión 7 de Java (51: 0 y mayor) en su lugar.
Me encontré con el mismo problema cuando trabajaba con un script Ant para compilar mi aplicación.
Utilizo Eclipse para el desarrollo de mi aplicación, y cambié la versión del compilador en las propiedades de compilación del proyecto. Pero eso no funcionó para mí. Luego descubrí que puedo proporcionar la versión del compilador en el script Ant.
Modifiqué el script Ant en la sección donde compila archivos Java.
<target name="build-java" depends="prepare-build">
<echo message="Compiling java files"/>
<javac ....
target="1.5"...
</javac>
</target>
Esto me funcionó para resolver el problema menor importante no admitido.
No te preocupes, lo tengo resuelto.
En realidad es simple: necesita instalar AMBOS JRE / JDK con la misma versión.
JRE 6 -> JDK 6
JRE 7 -> JDK 7
Y así.
Oh, Mac OS XI pudo resolver este problema configurando la variable JAVA_HOME:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
Primero vamos a hacer algunos conceptos básicos a la derecha ...
JRE es un componente en NetBeans / Eclipse / standalone que le proporcionará bibliotecas, JVM, complementos de Java y inicio web de Java. Tenga en cuenta que no proporciona cumplidores o depuradores.
JDK es el superconjunto de JRE junto con los cumplidores y los depuradores.
Entonces, cuando tengas tu biblioteca predeterminada como JRE en lugar de JDK, pasarás un momento agradable importando cosas, pero no se compilará.
En su lugar, establezca su ruta a JDK (yo uso NetBeans, y los configuro usando netbeans.conf en netbeans / etc / netbeans.conf y cambio la ruta).
Puede tener alguna biblioteca JAR compilada en Java 7, y solo tiene Java 6 como Java Runtime. Podría pasar con algunas bibliotecas nuevas.
Si se enfrenta a este problema mientras usa Maven , puede compilar de forma cruzada su código usando el compilador de Maven .
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
.....
ACTUALIZACIÓN: establezca el source
y el target
en 1.8
, si está utilizando JDK 8.
Su archivo Java se compila con una versión diferente (versión de compilador más alta) que la versión (versión de tiempo de ejecución más baja) con la que está intentando ejecutarlo.
Es básico comprender que se espera que las clases compiladas con versiones inferiores se ejecuten en las versiones posteriores posteriores. Pero a veces no es posible lo contrario (compilado con una versión de compilador más alta y tratando de ejecutarlo con una versión de tiempo de ejecución más baja).
Por lo tanto, se le muestra este error cuando intenta ejecutar su programa. No admitido major.minor version xx
P: He creado una aplicación en Java 7, pero cuando mis usuarios intentan ejecutarla, obtienen un error No compatible major.minor versión 51.0. ¿Qué significa esto y qué puedo hacer al respecto?
R: Si compila una aplicación usando javac en Java 7, los archivos de clase resultantes tendrán el número de versión 51.0. Las versiones de Java anteriores a 7 no reconocen este número, por lo que los usuarios deberán actualizar a Java 7 antes de ejecutar su aplicación. Si no está utilizando ninguna API de Java 7, puede intentar compilar su aplicación utilizando javac -target 1.6 para crear un archivo de clase compatible con 1.6. Si su aplicación se implementa utilizando webstart, puede especificar la versión mínima requerida. Para obtener más información, consulte la documentación sobre Java Web Start y JNLP aquí. Este problema desaparecerá una vez que activemos la actualización automática de Java 7 para los usuarios finales que actualmente tienen Java 6 en sus escritorios. La línea de tiempo para esto aún no está determinada, queremos darles a los desarrolladores tiempo para resolver cualquier problema entre su código y JDK 7 primero.
(Fuente: oracle.com .)
Tenía el problema por el que tenía que ejecutar una compilación de Maven en mi proyecto desde la línea de comandos para ejecutar mis pruebas de unidad; si hice un cambio en la clase de prueba y dejé que Eclipse lo recompile automáticamente, entonces obtuve el error "No compatible major.minor version 51.0".
Tengo ambos JDK6 y JDK7 instalados, pero todas mis configuraciones de JRE apuntaban a 1.6, tanto en el pom como desde la página de propiedades del proyecto en Eclipse. Ninguna cantidad de Proyecto de Actualización de Maven y / o actualización resolvió esto.
Finalmente, traté de cerrar el proyecto y volver a abrirlo, ¡y esto pareció arreglarlo! HTH
Tuve el mismo mensaje de error al ejecutar Ant desde Eclipse, pero las otras soluciones mencionadas aquí no solucionaron mi problema. Lo curioso fue que ejecutar Ant desde la línea de comandos de Windows funcionaba bien, por lo que tenía que ser un problema de configuración dentro de Eclipse.
Resultó que bajo Eclipse puede especificar el entorno con el que Ant debería estar ejecutándose y esto se estableció como un JRE en lugar de un JDK.
- Vaya a: Ejecutar -> Herramientas externas -> Configuraciones de herramientas externas ...
- Seleccione el Ant build.xml para su proyecto (si tiene múltiples proyectos)
- Activar la pestaña ''JRE''
- Aquí se seleccionó ''Separar JRE: jre6''. Cuando cambié esto a un JDK de la serie 1.6 o 1.7, el error desapareció.
Tuve el mismo problema con un proyecto escrito en 1.7 y traté de ejecutar en 1.6.
Mi solución en Eclipse:
Haga clic con el botón derecho en las Propiedades del proyecto -> Java Build Path -> Libraries
Seleccione su biblioteca del sistema JRE y haga clic en Editar a la derecha, y elija el JRE objetivo.
Ahora vaya al compilador de Java a la izquierda y cambie el nivel de cumplimiento del compilador a su objetivo.
Eso funcionó para mí.
Tuve una situación similar en Mac, y el siguiente proceso funcionó para mí:
En la terminal, escriba
vi ~/.profile
Luego agregue esta línea en el archivo, y guarde
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home
donde versión es la de tu computadora, como 1.7.0_25
.
Salga del editor, luego escriba el siguiente comando para que sea efectivo
source ~/.profile
Luego escribe java -version para verificar el resultado
java -version
¿Qué es el archivo .profile
?
El archivo .profile es un archivo oculto. Es un archivo opcional que le indica al sistema qué comandos ejecutar cuando el usuario cuyo archivo de perfil está conectado. Por ejemplo, si mi nombre de usuario es bruno y hay un archivo .profile en / Users / bruno /, todo su contenido Se ejecutará durante el procedimiento de inicio de sesión.
Tuvo este problema cuando volví a Java 6 y traté de ejecutar clases compiladas previamente con Java 7. Lo que funcionó para mí fueron Preferencias> java> compilador -> establecer el nivel de cumplimiento en 1.6 y "configurar los ajustes del proyecto" de manera crucial.
java.lang.UnsupportedClassVersionError
ocurre debido a un mayor JDK durante el tiempo de compilación y un menor JDK durante el tiempo de ejecución.
- Instale JDK 7.0.55 y configure Java para Eclipse para JDK 7.0.55.
- Cree el proyecto con JDK 7.0.55 configurándolo en la ruta de compilación JDK 7.0.55.
- Configure el compilador en Eclipse para JDK 7.0.55 mediante el menú Windows -> Preferencias -> Java -> Compilador - elija 1.7.
Si usas Maven, configura tu nivel de compilación de Java. Abra una línea de comando y escriba
java -version
para su nivel de compilación:Si utiliza IntelliJ IDEA, seleccione proyecto → Archivo → Configuración → Crear implementación de ejecución → Compilador → Compilador Java . Luego cambia el código de byte como 1.7 como esta imagen: