Em algumas situações temos o seguinte erro:
java.lang.IncompatibleClassChangeError: Implementing class
ou
java.lang.UnsupportedClassVersionError: XXXX: Unsupported major.minor version XX.X
Isso ocorre quando a versão do aplicativo foi compilada (javac) em uma versão superior à máquina virtual (java) que está sendo executada. Para descobrir a versão do seu .class, você pode executar o seguinte código:
String file = "/caminho/do/seu/Arquivo.class"; try (DataInputStream is = new DataInputStream(new FileInputStream(file))) { is.readInt(); // Magic Number = 0xCAFEBABE int minorVersion = is.readUnsignedShort(); int majorVersion = is.readUnsignedShort(); System.out.println(majorVersion + "." + minorVersion)); } catch (IOException e) { e.printStackTrace(); }
Nesse código estamos lendo um arquivo .class. O primeiro integer do arquivo é o número mágico dele, que se for um arquivo .class é 0xCAFEBABE. O próximo dado, que é um short sem sinal, contém a versão secundária da versão do compilador utilizada e o segundo short a versão principal.
As saídas podem ser as seguintes:
- Java 1.0 ou Java 1.1: 45.3
- Java 1.2: 46.0
- Java 1.3: 47.0
- Java 1.4: 48.0
- Java 5: 49.0
- Java 6: 50.0
- Java 7: 51.0
Com isso é só executar o comando java -version, para obter a versão da máquina virtual e verificar se o .class é compatível com a máquina virtual. Caso não seja, será necessário trocar para uma versão mais recente ou recompilar o binário para a versão correta.
Descobrindo a versão do seu bytecode.: Em algumas situações temos o seguinte erro: java.lan... http://t.co/U6QfcsyCMW (via @thiagovespa)