Como corrigir java.lang.UnsupportedClassVersionError

Como corrigir java.lang.UnsupportedClassVersionError

1. Introdução

Neste breve tutorial, aprenderemos o que causa o erro de tempo de execução Javajava.lang.UnsupportedClassVersionError: Unsupported major.minor version e como corrigi-lo.

2. Um olhar sobre o erro

Vamos começar examinando um exemplo de erro:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/example/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

This error is telling us that our class was compiled at a higher version of Java than the version with which we tried to run it. Mais especificamente, neste caso, compilamos nossa classe com Java 11 e tentamos executá-la com Java 8.

2.1. Números de versão do Java

Para referência, vamos dar uma olhada rápida nos números da versão Java. Isso será útil caso seja necessário fazer o download da versão Java apropriada.

Os números das versões principais e secundárias são armazenados na classe bytecode nos bytes seis e sete.

Vamos ver como os números das principais versões são mapeados para as versões 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. Corrigir através da linha de comando

Vamos agora discutir como podemos resolver esse erro ao executar Java na linha de comando.

Dependendo da nossa situação,we have two ways we can resolve this error: compile our code for an earlier version of Java, or run our code on a newer Java version.

A decisão final depende da nossa situação. Se precisarmos usar uma biblioteca de terceiros que já foi compilada em um nível superior, nossa melhor opção é provavelmente executar nosso aplicativo usando uma versão Java mais recente. Se estivermos empacotando um aplicativo para distribuição, pode ser melhor compilar para uma versão mais antiga.

3.1. JAVA_HOME Variável de ambiente

Vamos começar verificando como nossa variávelJAVA_HOME está definida. Isso nos dirá qual JDK está sendo usado quando executamosjavac em nossa linha de comando:

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

Se estivermos prontos para mudar totalmente para umJDK mais recente, podemos baixar a versão mais recente e garantir nossosPATHeJAVA_HOME environment variables are set appropriately.

3.2. Executando um Novo JRE

Voltando ao nosso exemplo, vamos ver como podemos resolver o erro executando-o em uma versão superior do Java. Supondo que temos Java 11 JRE emC:\Apps\jdk-11.0.2, podemos executar nosso código com o comandojava empacotado com ele:

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

3.3. Compilando com um JDK mais antigo

Se estivermos escrevendo um aplicativo que desejamos que seja executado em uma determinada versão do Java, precisamos compilar o código para essa versão.

Podemos fazer isso de três maneiras: usando um JDK mais antigo para compilar nosso código, usando as opções-bootclasspath,-sourcee-target do comandojavac (JDK 8 e mais antigos), ou usando a opção–release (JDK 9 e mais recentes).

Vamos começar usando um JDK mais antigo, da mesma forma que usamos um JRE mais recente para executar nosso código:

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

É possível usar apenas-sourcee-target, mas ainda pode criar arquivos de classe que não são compatíveis com um Java mais antigo.

Para garantir a compatibilidade, podemos apontar-bootclasspath emrt.jar do JRE de destino:

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

O acima se aplica principalmente ao JDK 8 e inferior. In JDK 9, the –release parameter was added to replace -source and -target. The –release option supports targets 6, 7, 8, 9, 10, and 11.

Vamos usar–release para direcionar o Java 8:

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

Agora podemos executar nosso código em um JRE Java 8 ou superior.

4. IDE do Eclipse

Agora que entendemos o erro e a abordagem geral para corrigi-lo, vamos pegar o que aprendemos e ver como podemos aplicá-lo ao trabalhar no IDE Eclipse.

4.1. Alterando o JRE

Supondo que já tenhamosEclipse configured with different versions of Java, vamos mudar o JRE do nosso projeto.

Vamos para o nossoProject properties, depois paraJava Build Path e depois para a guiaLibraries. Uma vez lá, selecionaremos o JRE e clicaremos emEdit:

image

Agora, vamos escolherAlternate JREe apontar para nossa instalação do Java 11:

image

Neste ponto, nosso aplicativo será executado no Java 11.

4.2. Alterando o nível do compilador

Vamos agora ver como podemos mudar nosso destino para um nível inferior de Java.

Primeiro, vamos voltar ao nossoProject properties, depoisJava Compiler, e verificarEnable project specific settings:

image

Aqui, podemos definir nosso projeto para compilar versões anteriores do Java e personalizar outras configurações de conformidade:

image

5. IntelliJ IDEA

Também podemos controlar a versão do Java que estamos usando para compilar e executar no IntelliJ IDEA.

5.1. Incluindo um JDK

Antes de fazermos isso, veremos como adicionar JDKs adicionais. Vamos paraFile → Project Structure → Platform Settings → SDKs:

image

Vamos clicar no ícone de mais na coluna do meio, selecionarJDK no menu suspenso e selecionar nosso local JDK:

image

5.2. Alterando o JRE

Primeiro, veremos como usar o IDEA para executar nosso projeto no JRE mais recente.

Vamos paraRun → Edit Configurations…e mudar nossoJRE para 11:

image

Agora, quando executarmos nosso projeto, ele será executado com o Java 11 JRE.

5.3. Alterando o nível do compilador

Se estivermos distribuindo nosso aplicativo para rodar em um JRE inferior, precisamos ajustar nosso nível de compilador para direcionar a versão mais antiga do Java.

Vamos paraFile → Project Structure… → Project Settings → Projecte mudar nossosProject SDKeProject language level:

image

Agora podemos construir nosso projeto, e os arquivos de classe gerados serão executados no Java 8 e superior.

6. Maven

Quando construímos e empacotamos um arquivo emMaven, podemos controlar oversion of Java que almejamos.

Ao usar Java 8 ou anterior, definimos a origem e o destino do plug-in do compilador.

Vamos definir a origem e o destino usando as propriedades do plug-in do compilador:


    1.8
    1.8

Como alternativa, podemos definir a origem e o destino no plug-in do compilador:


    
        maven-compiler-plugin
        
            1.8
            1.8
        
    

Com a opção–release adicionada no Java 9, podemos configurar isso com o Maven também.

Vamos usar uma propriedade de plug-in do compilador para definir orelease:


    8

Ou podemos configurar o plug-in do compilador diretamente:


    
        maven-compiler-plugin
        
            8
        
    

7. Conclusão

Neste breve artigo, aprendemos o que causa a mensagem de errojava.lang.UnsupportedClassVersionError: Unsupported major.minor version e como corrigi-la.