Magia ou versão de arquivo de classe ruim

101

Eu já sei que essa pergunta já foi feita com frequência e respostas, mas nenhuma das respostas que encontrei resolveu meu problema.

É o erro:

Error:Gradle: Execution failed for task ':ffcommunity:preDexDebug'.
 com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    D:\Android SDK\sdk\build-tools\20.0.0\dx.bat --dex --output D:\Users\ReVo\Documents\IntelliJ IDEA\FFCommunity\ffcommunity\build\intermediates\pre-dexed\debug\bananaquery-2ee85432877a057e7414910b8127805535139d5d.jar D:\Users\ReVo\Documents\IntelliJ IDEA\FFCommunity\ffcommunity\libs\bananaquery.jar
Error Code:
    1
Output:
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
        at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
        at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
        at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
        at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
        at com.android.dx.command.dexer.Main.processClass(Main.java:665)
        at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634)
        at com.android.dx.command.dexer.Main.access$600(Main.java:78)
        at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572)
        at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
        at com.android.dx.command.dexer.Main.processOne(Main.java:596)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
        at com.android.dx.command.dexer.Main.run(Main.java:230)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)
    ...while parsing com/comuf/revonline/bananaquery/BananaInsert.class
    1 error; aborting

O erro é bad class file magic (cafebabe) or version (0034.0000).

Construí e executei o aplicativo sem problemas muitas vezes no mesmo dia, mas agora isso falha todas as vezes com esta mensagem.


O SDK do projeto é Android API 19 Platforme o nível do projeto é 1.7.

CompileSDK é 19e buildToolsVersion é '20.0.0'.

Opções de compilação:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

e dependencieseu tenho:

compile files('libs/bananaquery.jar')

A biblioteca é construída com SDK Android API 19 Platformcom nível de projeto 1.7.

Meu .jararquivo está dentro da libs/pasta.

Eu uso o IntelliJ IDEA 14 Preview, pode ser o motivo? Com o IntellIJ IDEA 13, ele permanece travado na "sincronização do Gradle"

compilar arquivos podem ser inúteis, pois eu compile fileTree(dir: 'libs', include: ['*.jar'])também

Marco Acierno
fonte
Oi, eu tenho um problema semelhante, mas colocar o compilador de projeto em 1.7 não ajuda, por favor, você pode dar uma olhada? stackoverflow.com/questions/29098038/…
Csabi
O problema pode ser um monte de coisas, usei 1.7 porque estava usando Java 1.7, tente mudar para 1.6
Marco Acierno
Oi eu tentei todo o projeto colocado em 1.6 não ajuda, eu estava usando essa biblioteca antes, acabei de atualizar o arquivo .jar com uma versão mais recente, pode ser um problema que ele é compilado com java superior?
Csabi
Percorri o longo caminho de corrigir esse problema e percebi que o erro de compilação estava ocorrendo em uma biblioteca que eu estava importando. Esta é uma distinção importante porque nenhuma alteração nas configurações do compilador IDE local corrigirá algo que está sendo importado.
Shadoninja de

Respostas:

95

minha JAVA_HOMEvariável mudou para Java 1.8 e recebi esta mensagem de erro ao compilar um módulo Java puro como uma dependência do meu projeto android.

build.gradle do módulo java

apply plugin: 'java'

Solução # 1: Rápido e sujo

Eu consertei colocando minhas JAVA_HOMEcostas em 1,7:

export JAVA_HOME=`/usr/libexec/java_home -v 1.7`

Solução 2: alterar a versão do compilador:

mude de volta para 1.7 para este módulo específico em seu build.gradle

apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
passsy
fonte
4
Na versão experimental do Gradle, a sintaxe é:compileOptions.with { sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7 }
Stephen Kaiser
A Solução 2 funcionou para mim, embora o Android Studio tenha sublinhado em cinza sourceCompatibility e targetCompatibility dizendo que "Atribuição não é usada"
CodyF
39

Ok, meu mal.

Na seção SDK do projeto, ao adicionar um, Android SDKvocê deve fornecer o Java SDKe todos os meus SDKs do Android usam Java 8 como SDK para criar os arquivos de classe com a versão errada, mesmo se o nível do projeto for 1.7(não sei por que, suponho que tudo foi escolhido por nível de projeto).

Agora mudei o SDK (a java version "1.x.0"parte).

insira a descrição da imagem aqui

e parece compilar bem.

O motivo que funcionou antes de hoje foi porque meu SDK era 1.8e nãoAndroid API x

Marco Acierno
fonte
Eu tenho o mesmo problema. onde devo mudar isso. Obrigado
rúpia de
1
Ao adicionar um SDK do Android, você deve especificar a qual SDK se refere ... (No meu caso, selecionei Java 7 porque estava usando esta versão) Mas depende do seu caso também. Pesquise online por outros erros com o mesmo nome, você encontrará muitas informações
Marco Acierno
você está falando sobre a tela de preferências ??
rúpia de
3
Abra a janela de estrutura do projeto> Onde está a seleção com a mensagem "SDK do projeto", selecione o SDK que você precisa (seu código ou a versão do SDK usada para compilar a biblioteca externa). Se você tiver o mesmo problema, verifique sua linha Android SDK e clique em "Editar". Você será movido para outro painel, onde você tem o Java SDK, selecione 1.7 (ou a versão que você precisa compilar)
Marco Acierno
2
Corrigida a mesma situação acessando Configurações do Módulo e editando o local do JDK para o diretório inicial onde um Java 7 jre foi instalado
zztonedefzz
27

Caso as pessoas achem a resposta de @Marco Acierno um pouco confusa, a solução é garantir que você esteja construindo com Java 7 e não uma versão superior.

Para Android Studio, mude File -> Project Structure -> SDK Location -> JDK Locationpara jdk1.7.x. Para a linha de comando, garanta java -versionsaídas java version "1.7.x".

Chris Lacy
fonte
Eu estava usando o IntelliJ IDEA, então, no meu caso, tive que colocar o Java SDK correto quando adicionei o Android SDK ... (você não pode apenas selecionar Java 1.x em um módulo Android, caso contrário, ele não verá as classes Android)
Marco Acierno
15
Por que não podemos usar o java 8?
Sujay
5

Definir JAVA_HOME de volta para 1.7 funcionou para mim.

Vishal Singh
fonte
3

mude toda a sua versão do módulo java para java 1.7 em cada arquivo build.grade.

no plugin que é a biblioteca e o aplicativo

compileOptions{
    sourceCompatibility=JavaVersion.VERSION_1_7
    targetCompatibility=JavaVersion.VERSION_1_7
}

e em java

sourceCompatibility= 1.7
targetCompatibility= 1.7
baiiu
fonte
Essa era a única coisa que eu precisava fazer. Obrigado
Chisko
2

Esse problema ocorre quando você usa um .jararquivo que não está usando nenhum recurso do Java 6 ou superior, mas foi criado com o Java 6 ou superior.

Se você criou esse .jararquivo, não precisa alterar nada em Gradleou ProGuardou Compiler Version. A solução é muito simples, basta construir esse .jararquivo novamente, mas usando Java 5 ou menos .

Mais detalhes .

Bugs acontecem
fonte
no meu caso, é o arquivo .aar. O que devo fazer?
GvSharma
1

Eu tive um problema semelhante, resolvi-o atualizando meu proguard. obtenha sua versão do programa por este comando

java -jar ~/android-sdks/tools/proguard/lib/proguard.jar 

obtenha o arquivo progaurd.jar mais recente aqui ( http://proguard.sourceforge.net )

substitua o android-sdks / tools / proguard / lib / proguard.jar existente pelo novo arquivo .jar.

Esperançosamente, isso deve ajudá-lo. Se você estiver usando java 8, deverá atualizar para o proguard 5.x porque o proguard 4.x não oferece suporte ao java 8.

spaceMonkey
fonte
@RookieGuy tente definir a versão java de volta para 1.7, que também funcionou para mim.
spaceMonkey
Obrigado pela dica, eu tive que recompilar as bibliotecas que foram incluídas com dependências transitivas, escrevi aqui uc-mobileapps.com/index.html%3Fp=509.html para referência, já que as versões mudaram bastante
RookieGuy
1

Tive um problema semelhante quando tentei adicionar uma biblioteca criada pelo próprio netbeans ao android studio. definir a compatibilidade de origem e destino no android studio e o formato de origem / binário em netbeans (ambos!) para java 1.7 resolveu o problema.

no android studio:

Estrutura do Projeto -> Módulos / Aplicativo -> Propriedades -> Fonte- e Alvo para 1.7

no netbeans:

Arquivo -> Propriedades do projeto -> Fontes -> Formato fonte / binário para 1,7

em seguida, limpe e construa seu projekt netbeans e copie o .jar de "NBProj / dist" para "app / libs"

RickPat
fonte
0

compartilhe a solução do caso se apenas o Java8 estiver instalado, basta definir o nível do compilador Java para 1.7 e, em seguida, reconstruir o projeto deve estar OK.

Suiwenfeng
fonte
0

Recebi o erro ao usar uma biblioteca de terceiros. De acordo com a questão mencionada acima, foi necessário substituir a biblioteca de acordo com a mensagem de rastreamento de pilha acima:

        ...
    ...while parsing com/comuf/revonline/bananaquery/BananaInsert.class
    ...

com a versão apropriada.

Correspondente à pergunta, bananaquery.jardeve ser substituído pela versão compatível com Java.

tenho dois
fonte