java.lang.UnsupportedClassVersionError: número de versão inválido no arquivo .class?


140

Estou recebendo esse erro ao incluir uma biblioteca de código-fonte aberto que precisei compilar a partir do código-fonte. Agora, todas as sugestões na web indicam que o código foi compilado em uma versão e executado em outra versão (nova na antiga). No entanto, só tenho uma versão do JRE no meu sistema. Se eu executar os comandos:

$ javac -version
javac 1.5.0_18

$ java -version
java version "1.5.0_18"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_18-b02)
Java HotSpot(TM) Server VM (build 1.5.0_18-b02, mixed mode)

e verifique no Eclipse as propriedades da biblioteca java, recebo 1.5.0_18

Portanto, tenho que concluir que outra coisa, interna à própria classe, está lançando a exceção? É mesmo possível?


2
você tem uma versão compilada da biblioteca em outro lugar que possa estar no seu caminho de classe primeiro?
Jeff Storey

Boa ideia, mas não. Fiz uma verificação usando 'find. -name '* .jar' | xargs localizar 'da pasta lib com os JARs. Além disso, não acho que o Eclipse usasse o CLASSPATH? Alguma outra boa sugestão?
grmn.bob

como usar este comando find -name '* .jar' no cmd, pois estou procurando reconstruir o código jre src novamente ... e para isso eu preciso disparar esse cmd ..... javalobby.org/java/forums /t103334.html.....my jdk está em C: \ Arquivos de programas \ Java \ jdk1.6.0_31
Aluno

Respostas:


185

Aprendi que mensagens de erro como essa geralmente estão corretas. Quando POSSÍVEL (em sua mente) não poderia ser o que o erro relatado diz, você procura um problema em outra área ... apenas para descobrir horas depois que a mensagem de erro original estava realmente certa.

Como você está usando o Eclipse, acho que o Thilo está certo. O motivo mais provável de você receber esta mensagem é porque um de seus projetos está compilando classes 1.6. Não importa se você possui apenas um JRE 1.5 no sistema, porque o Eclipse possui seu próprio compilador (não javac) e precisa apenas de um 1.5 JRE para compilar as classes 1.6. Pode ser estranho, e uma configuração precisa ser desmarcada para permitir isso, mas eu consegui.

Para o projeto em questão, verifique a seção Propriedades do Projeto (geralmente Alt + Enter), Java Compiler. Aqui está uma imagem de um projeto configurado para compilar 1.6, mas com apenas um 1.5 JRE.

insira a descrição da imagem aqui


Concordo totalmente ... foi por isso que perguntei, no meu comentário, a questão de maneiras de identificar. Eu não conhecia as classes internas do Eclipse. A biblioteca foi compilada na linha de comando com 'javac' e integrada ao meu projeto Eclipse. Vou tentar compilar meu projeto a partir da linha de comando. Você claramente resolveu esse problema no passado e suas sugestões são fantásticas.
grmn.bob

3
Se você tiver o JDK (que possui fontes), poderá adicionar alguns pontos de interrupção no Eclipse e, esperançosamente, ver qual classe está tentando carregar. A maneira mais fácil é provavelmente um ponto de interrupção no construtor para UnsupportedClassVersionError (ou um ponto de interrupção do Eclipse Exception, o ícone 'J!'), Para que você possa inspecionar como chegou lá.
Joshua McKinnon

ESTÁ BEM. Encontrei um especialista no prédio e ele foi capaz de apontar o Eclipse para o mesmo JRE da minha linha de comando. Eu então reconstruí contra 1.6 e corri contra 1.6 e está tudo funcionando. Obviamente, eu estava errado em não ter nada além de 1,5. Ele me mostrou onde procurar. Obrigado pela ajuda - agora estou no meu próximo problema! :)
grmn.bob

2
Eu tive o mesmo problema. O erro que cometi foi usar o compilador 1.5 JRE e 1.6. O que não resolveu o erro de versão não suportada da classe. Então, instalei o JRE 1.6 no meu eclipse e usei o compilador 1.6. Então tudo começou a funcionar bem.
Vanchinathan Chandrasekaran

1
Quero votar novamente pela segunda vez, porque é a segunda vez que tive o problema, procurei, encontrei esta resposta e está certo. > _ <
AlbeyAmakiir

9

Você tentou fazer uma "limpeza" completa e depois reconstruir no Eclipse (Projeto-> Limpar ...)?

Você é capaz de compilar e executar com "javac" e "java" diretamente da linha de comando? Isso funciona corretamente?

Se você clicar com o botão direito do mouse em seu projeto, vá para "Propriedades" e depois para "Java Build Path", existem entradas suspeitas em alguma das guias? Este é essencialmente o seu CLASSPATH.

Nas preferências do Eclipse, convém verificar novamente a seção "JREs Instalados" na seção "Java" e verificar se ela corresponde ao que você acha que deveria.

Você definitivamente tem um arquivo .class antigo em algum lugar ou está obtendo uma incompatibilidade em tempo de compilação / tempo de execução nas versões do Java que está usando.


sim (totalmente limpo); não tentei (projeto da linha cmd); talvez / não (removi as entradas do Eclipse "Java Build Path"); fiz isso (JREs - foi aí que eu peguei a versão #).
grmn.bob

5

Você compilou com o Eclipse? Ele usa um compilador diferente (não javac). Isso não deve resultar nesse erro (se tudo estiver configurado corretamente), mas você pode tentar compilá-lo com o javac.

Se isso resolveu o problema, tente ver se o Eclipse possui algumas configurações incorretas do compilador. Especificamente, direcione-o para o Java 5.


É isso que estou aprendendo. Vou tentar construir as duas peças da mesma maneira (linha cmd e / ou eclipse).
grmn.bob

1
Obrigado Thilo, eu aprendi muito hoje sobre Eclipse e Java e versões de classe. E um pouco sobre formiga também.
grmn.bob

2

Eu também recebi o mesmo erro. Razão para isso eu estava compilando o projeto usando o Maven. Eu tinha JAVA_HOME apontando para JDK7 e, portanto, o java 1.7 estava sendo usado para compilação e, ao executar o projeto, estava usando o JDK1.5. Alterar a entrada abaixo no arquivo .classpath ou alterar no eclipse, como na captura de tela, resolveu o problema.

classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5

ou alteração nas configurações de execução do eclipse como insira a descrição da imagem aqui


1

Verifique também todos os arquivos jar em seu projeto que foram compilados para uma versão superior do Java. Se essas são suas próprias bibliotecas, você pode corrigir isso alterando o atributo da versão de destino para javac

<javac destdir="${classes.dir}"
            debug="on" classpathref="project.classpath" target="1.6">

0

Outro cenário em que isso pode acontecer é quando você está iniciando uma instância do eclipse (para depuração etc.) a partir de um eclipse host - nesse caso, alterar o nível do projeto ou a biblioteca JRE no caminho de classe do projeto não ajuda. O que importa é o JRE usado para ativar o ambiente de eclipse de destino.


0

Sempre verifique o óbvio também. Recebi esse erro uma vez quando acidentalmente peguei o recurso errado para a ação de adicionar e remover do servidor. Pode ser fácil ignorar.


0

A exclusão dos arquivos de configurações específicas do projeto (área de trabalho do Eclipse / pasta do projeto / .settings /) da pasta do projeto também funcionará. Obviamente, precisamos limpar e construir um projeto após a exclusão.


0

alterando o projeto para usar o java 1.7: Para que isso funcione, siga estas etapas:

  • Alterar o nível de conformidade do compilador
  • Mude seus projetos JRE / JDK para algo do mesmo nível (1,7 no meu caso)
  • Faça a mesma alteração em todos os projetos referenciados pelo seu projeto
  • Altere sua configuração de execução / depuração para usar o JRE / JDK (ou do mesmo nível)

Não está funcionando?

  • excluir projetos Diretório Bin
  • Limpar \ limpo
  • reconstruir

Ainda não funciona?

no diretório do seu projeto: edite .settings / org.eclipse.jdt.core.prefs> verifique se o nível de destino está aplicado

Boa sorte!


0

Eu resolvi esse problema alterando o jre necessário para o servidor (no meu caso é o tomcat). Na guia Servidor no eclipse, clique duas vezes no servidor (para abrir a página para a configuração do servidor), clique em Runtime Environment e altere o JRE necessário

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.