Плохая магия или версия файла класса

101

Я уже знаю, что этот вопрос уже задавали очень часто, и на него есть ответы, но ни один из ответов, которые я нашел, не решил мою проблему.

Это ошибка:

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

Ошибка есть bad class file magic (cafebabe) or version (0034.0000).

Я без проблем собрал и запустил приложение много раз в один и тот же день, но теперь это сообщение терпит неудачу каждый раз.


Project SDK есть, Android API 19 Platformа уровень проекта есть 1.7.

CompileSDK есть, 19а buildToolsVersion есть '20.0.0'.

Варианты компиляции:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

и у dependenciesменя есть:

compile files('libs/bananaquery.jar')

Библиотека построена с помощью SDK Android API 19 Platformна уровне проекта 1.7.

Мой .jarфайл находится внутри libs/папки.

Я использую IntelliJ IDEA 14 Preview, может быть причина? В IntellIJ IDEA 13 он застревает в "синхронизации Gradle"

компилировать файлы может быть бесполезно, так как у меня compile fileTree(dir: 'libs', include: ['*.jar'])тоже

Марко Асьерно
источник
Привет, у меня похожая проблема, но установка компилятора проекта на 1.7 не помогает, можете ли вы взглянуть? stackoverflow.com/questions/29098038/…
Csabi
Проблема может заключаться во многих вещах, я использовал 1.7, потому что использовал Java 1.7, попробуйте изменить его на 1.6
Марко Асьерно
Привет, я попробовал весь проект в 1.6, это не помогает, я использовал эту библиотеку раньше, я только что обновил файл .jar до более новой версии. Может быть проблема, что он скомпилирован с более высокой java?
Csabi
Я прошел долгий путь исправления этой проблемы и понял, что ошибка компиляции произошла в библиотеке, которую я импортировал. Это важное различие, потому что никакие изменения настроек локального компилятора IDE не исправят то, что импортируется.
Shadoninja

Ответы:

95

моя JAVA_HOMEпеременная изменилась на Java 1.8, и я получил это сообщение об ошибке при компиляции чистого java-модуля в зависимости от моего проекта Android.

build.gradle модуля java

apply plugin: 'java'

Решение №1: Быстро грязное

Я исправил это, установив JAVA_HOMEобратно на 1,7:

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

Решение №2: изменить версию компилятора:

вернитесь к 1.7 для этого конкретного модуля в его build.gradle

apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
прохожий
источник
4
В экспериментальной версии Gradle синтаксис следующий:compileOptions.with { sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7 }
Стивен Кайзер
Решение 2 сработало для меня, хотя Android Studio подчеркнула серым цветом sourceCompatibility и targetCompatibility, говоря, что «Assignment is not used»
CodyF
39

Хорошо, моя проблема.

В разделе Project SDK, когда вы добавляете, Android SDKвы должны предоставить, Java SDKи все мои Android SDK используют Java 8 в качестве SDK, поэтому он создает файлы классов с неправильной версией, даже если уровень Project равен 1.7(я не знаю почему, я предположил что все было выбрано уровнем Проекта).

Теперь я поменял SDK ( java version "1.x.0"часть.)

введите описание изображения здесь

и, кажется, компилируется нормально.

Причина, по которой это работало до сегодняшнего дня, заключалась в том, что мой SDK был, 1.8а неAndroid API x

Марко Асьерно
источник
У меня такая же проблема. где я должен это изменить. Спасибо
rupesh
1
Когда вы добавляете Android SDK, вы должны указать, на какой SDK вы ссылаетесь ... (В моем случае я выбрал Java 7, потому что использовал эту версию) Но это тоже зависит от вашего случая. Поищите в Интернете другие ошибки с тем же именем, вы найдете много информации
Марко Асьерно,
ты про экран настроек ??
рупеш
3
Откройте окно «Структура проекта»> «Выберите» с сообщением «Project SDK» и выберите нужный SDK (ваш код или версию SDK, используемую для компиляции внешней библиотеки). Если у вас такая же проблема, проверьте строку Android SDK и нажмите «Изменить». Вы будете перемещены на другую панель, где у вас есть Java SDK, выберите 1.7 (или версию, которую нужно скомпилировать)
Марко Асьерно,
2
Исправлена ​​та же ситуация, перейдя в Настройки модуля и отредактировав местоположение JDK в домашнем каталоге, в котором была установлена ​​Java 7 jre
zztonedefzz
27

Если люди находят ответ @Marco Acierno немного неясным, решение состоит в том, чтобы убедиться, что вы строите с помощью Java 7, а не более поздней версии.

Для Android Studio измените File -> Project Structure -> SDK Location -> JDK Locationна jdk1.7.x. Для командной строки обеспечьте java -versionвыходы java version "1.7.x".

Крис Лейси
источник
Я использовал IntelliJ IDEA, поэтому в моем случае мне пришлось поставить правильный Java SDK, когда я добавил Android SDK ... (вы не можете просто выбрать Java 1.x в модуле Android, иначе он не увидит классы Android)
Марко Acierno
15
Почему мы не можем использовать Java 8?
Суджай, 03
5

Установка JAVA_HOME обратно на 1.7 сработала для меня.

Вишал Сингх
источник
3

измените все версии вашего модуля java на java 1.7 в каждом файле build.grade.

в плагине, который является библиотекой и приложением

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

и в Java

sourceCompatibility= 1.7
targetCompatibility= 1.7
baiiu
источник
Это было единственное, что мне нужно было сделать. Спасибо
Chisko
2

Эта проблема возникает, когда вы используете .jarфайл, в котором не используются какие-либо функции Java 6 или выше, но который был создан с использованием Java 6 или выше.

Если вы создали этот .jarфайл, вам не нужно ничего менять в Gradleили ProGuardили Compiler Version. Решение очень простое, просто создайте этот .jarфайл снова, но с использованием Java 5 или ниже .

Подробнее .

Ошибки случаются
источник
в моем случае это файл .aar. Что я должен делать?
GvSharma 08
1

У меня была аналогичная проблема, я решил ее обновив свой прогард. получить версию proguard с помощью этой команды

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

получите последний файл progaurd.jar отсюда ( http://proguard.sourceforge.net )

замените существующий android-sdks / tools / proguard / lib / proguard.jar новым файлом .jar.

Надеюсь, это поможет вам. Если вы используете java 8, вам следует перейти на proguard 5.x, потому что proguard 4.x не поддерживает java 8.

spaceMonkey
источник
@RookieGuy попробуйте установить версию java обратно на 1.7, это тоже сработало для меня.
spaceMonkey
Спасибо за подсказку, мне пришлось перекомпилировать библиотеки, которые были включены с транзитивными зависимостями, написал это здесь uc-mobileapps.com/index.html%3Fp=509.html для справки, поскольку версии сильно изменились
RookieGuy
1

была аналогичная проблема, когда я пытался добавить самодельную библиотеку из netbeans в студию Android. установка исходной и целевой совместимости в студии Android и исходный / двоичный формат в netbeans (оба!) на java 1.7 решила проблему.

в студии Android:

Структура проекта -> Модули / Приложение -> Свойства -> Исходный код и цель до 1.7

в netbeans:

Файл -> Свойства проекта -> Источники -> Исходный / двоичный формат до 1,7

затем очистите и создайте свой проект netbeans и скопируйте .jar из «NBProj / dist» в «app / libs»

RickPat
источник
0

поделитесь решением случая, если установлена ​​только Java8, просто установите уровень компилятора Java на 1.7, а затем перестройте проект, должно быть все в порядке.

Suiwenfeng
источник
0

Я получил ошибку при использовании сторонней библиотеки. В соответствии с вышеупомянутым вопросом, необходимо было заменить библиотеку в соответствии с приведенным выше сообщением трассировки стека:

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

с соответствующей версией.

В соответствии с вопросом, bananaquery.jarдолжна быть заменена на Java-совместимую версию.

gotwo
источник