Cómo reparar java.lang.UnsupportedClassVersionError

1. Introducción

En este breve tutorial, aprenderemos qué causa el error en tiempo de ejecución de Java java.lang.UnsupportedClassVersionError: Unsupported major.minor version y cómo solucionarlo.

2. Una mirada al error

Comencemos mirando un error de ejemplo:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/baeldung/MajorMinorApp has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

Este error nos dice que nuestra clase se compiló en una versión de Java superior a la versión con la que intentamos ejecutarla. Más específicamente, en este caso, compilamos nuestra clase con Java 11 e intentamos ejecutarla con Java 8.

2.1. Números de versión de Java

Como referencia, echemos un vistazo rápido a los números de versión de Java. Esto será útil en caso de que necesitemos descargar la versión apropiada de Java.

Los números de versión mayor y menor se almacenan en el código de bytes de la clase en los bytes seis y siete.

Veamos cómo se asignan los números de la versión principal a las versiones de Java:

  • 45 = Java 1.1
  • 46 = Java 1.2
  • 47 = Java 1.3
  • 48 = Java 1.4
  • 49 = Java 5
  • 50 = Java 6
  • 51 = Java 7
  • 52 = Java 8
  • 53 = Java 9
  • 54 = Java 10
  • 55 = Java 11
  • 56 = Java 12
  • 57 = Java 13

3. Arreglar a través de la línea de comandos

Analicemos ahora cómo podemos resolver este error al ejecutar Java desde la línea de comandos.

Dependiendo de nuestra situación, tenemos dos formas de resolver este error: compilar nuestro código para una versión anterior de Java o ejecutar nuestro código en una versión más reciente de Java .

La decisión final depende de nuestra situación. Si necesitamos usar una biblioteca de terceros que ya ha sido compilada en un nivel superior, probablemente nuestra mejor opción sea ejecutar nuestra aplicación usando una versión más reciente de Java. Si estamos empaquetando una aplicación para su distribución, sería mejor compilarla en una versión anterior.

3.1. Variable de entorno JAVA_HOME

Comencemos verificando cómo está configurada nuestra variable JAVA_HOME . Esto nos dirá qué JDK se está utilizando cuando ejecutamos javac desde nuestra línea de comando:

echo %JAVA_HOME% C:\Apps\Java\jdk8-x64

Si estamos listos para pasar por completo a un JDK más nuevo, podemos descargar la versión más reciente y asegurarnos de que nuestras variables de entorno PATH y JAVA_HOME estén configuradas correctamente.

3.2. Ejecución de un nuevo JRE

Volviendo a nuestro ejemplo, veamos cómo podemos resolver el error ejecutándolo en una versión superior de Java. Suponiendo que tengamos Java 11 JRE en C: \ Apps \ jdk-11.0.2 , podemos ejecutar nuestro código con el comando java empaquetado con él:

C:\Apps\jdk-11.0.2\bin\java com.baeldung.MajorMinorApp Hello World!

3.3. Compilar con un JDK anterior

Si estamos escribiendo una aplicación que queremos que se pueda ejecutar en una determinada versión de Java, necesitamos compilar el código para esa versión.

Podemos hacer que en una de tres maneras: mediante un JDK más para compilar nuestro código, utilizando el -bootclasspath , -fuente y -target opciones del javac comando (JDK 8 años o más), o utilizando el -release opción (JDK 9 y más reciente).

Comencemos usando un JDK más antiguo, de manera similar a como usamos un JRE más nuevo para ejecutar nuestro código:

C:\Apps\Java\jdk1.8.0_31\bin\javac com/baeldung/MajorMinorApp.java

Es posible utilizar sólo -fuente y -target , pero todavía podría crear archivos de clases que no son compatibles con Java más.

Para garantizar la compatibilidad, podemos apuntar -bootclasspath al rt.jar del JRE objetivo:

javac -bootclasspath "C:\Apps\Java\jdk1.8.0_31\jre\lib\rt.jar" \ -source 1.8 -target 1.8 com/baeldung/MajorMinorApp.java

Lo anterior se aplica principalmente a JDK 8 y versiones anteriores. En JDK 9, la -RELEASE se añadió parámetro para reemplazar -source y -target . La opción –release admite los destinos 6, 7, 8, 9, 10 y 11.

El uso de Let -RELEASE para apuntar Java 8:

javac --release 8 com/baeldung/MajorMinorApp.java

Ahora podemos ejecutar nuestro código en un JRE Java 8 o superior.

4. Eclipse IDE

Ahora que entendemos el error y el enfoque general para corregirlo, tomemos lo que hemos aprendido y veamos cómo podemos aplicarlo cuando trabajamos en el IDE de Eclipse.

4.1. Cambiar el JRE

Suponiendo que ya tenemos Eclipse configurado con diferentes versiones de Java, cambiemos el JRE de nuestro proyecto.

Vayamos a las propiedades de nuestro proyecto , luego a Java Build Path y luego a la pestaña Bibliotecas . Una vez allí, seleccionaremos el JRE y haremos clic en Editar :

Ahora, elijamos JRE alternativo y apuntemos a nuestra instalación de Java 11:

En este punto, nuestra aplicación se ejecutará en Java 11.

4.2. Cambiar el nivel del compilador

Veamos ahora cómo podemos cambiar nuestro objetivo a un nivel inferior de Java.

First, let's go back to our Project properties, then Java Compiler, and check Enable project specific settings:

Here, we can set our project to compile for earlier versions of Java and customize other compliance settings:

5. IntelliJ IDEA

We can also control the version of Java we're using for compiling and running in IntelliJ IDEA.

5.1. Adding a JDK

Before we do that, we'll see how to add additional JDKs. Let's go to File -> Project Structure -> Platform Settings -> SDKs:

Let's click the plus icon in the middle column, select the JDK from the drop-down, and select our JDK location:

5.2. Changing the JRE

First, we'll look at how to use IDEA to run our project on the newer JRE.

Let's go to Run -> Edit Configurations… and change our JRE to 11:

Now, when we run our project, it will run with the Java 11 JRE.

5.3. Changing the Compiler Level

If we're distributing our application to run on a lower JRE, we need to adjust our compiler level to target the older version of Java.

Let's go to File -> Project Structure… -> Project Settings -> Project and change our Project SDK and Project language level:

We can now build our project, and the class files generated will run on Java 8 and higher.

6. Maven

When we build and package a file in Maven, we can control the version of Java we target.

When using Java 8 or older, we set the source and target for the compiler plugin.

Establezcamos la fuente y el destino usando las propiedades del complemento del compilador:

 1.8 1.8 

Alternativamente, podemos establecer la fuente y el destino en el complemento del compilador:

  maven-compiler-plugin  1.8 1.8   

Con la opción –release agregada en Java 9, también podemos configurar eso con Maven.

Usemos una propiedad de complemento del compilador para establecer la versión :

 8 

O podemos configurar el complemento del compilador directamente:

  maven-compiler-plugin  8   

7. Conclusión

En este breve artículo, aprendimos qué causa el mensaje de error java.lang.UnsupportedClassVersionError: Unsupported major.minor version y cómo solucionarlo.