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:
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:
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:
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.
Vamos para o nossoProject properties, depois paraJava Build Path e depois para a guiaLibraries. Uma vez lá, selecionaremos o JRE e clicaremos emEdit:
Agora, vamos escolherAlternate JREe apontar para nossa instalação do Java 11:
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:
Aqui, podemos definir nosso projeto para compilar versões anteriores do Java e personalizar outras configurações de conformidade:
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:
Vamos clicar no ícone de mais na coluna do meio, selecionarJDK no menu suspenso e selecionar nosso local JDK:
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:
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.
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.81.8
Como alternativa, podemos definir a origem e o destino no plug-in do compilador:
maven-compiler-plugin1.81.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-plugin8
7. Conclusão
Neste breve artigo, aprendemos o que causa a mensagem de errojava.lang.UnsupportedClassVersionError: Unsupported major.minor version e como corrigi-la.