Descobrindo a versão do seu bytecode.

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.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6