Неправильна магія файлу класу або версія


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).

Я створив і виконую програму без проблем багато разів за один і той же день, але тепер це не вдається з цим повідомленням.


Проект 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 sync"

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


Привіт У мене є подібна проблема, але поставити компілятор проектів до 1,7 не допомагає, будь ласка, можете поглянути? stackoverflow.com/questions/29098038 / ...
Csabi

Проблема може бути в багатьох речах, я використовував 1.7, тому що використовував Java 1.7, спробуйте змінити її на 1.6
Marco Acierno

Привіт, я спробував весь проект, поставлений на 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 сіро підкреслив джерело сумісності та targetCompatibility, сказавши, що "Призначення не використовується"
CodyF

39

Гаразд, моя погана.

У розділі Project SDK під час додавання Android SDKви повинні вказати, Java SDKі всі мої SDK для Android використовують Java 8 як SDK, щоб вони створювали файли класів із неправильною версією, навіть якщо рівень проекту 1.7(я не знаю, чому, я вважаю що все було обрано рівнем проекту).

Тепер я змінив SDK ( java version "1.x.0"частина.)

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

і, здається, складати прекрасно.

Причина, яка працювала до сьогодні, полягала в тому, що мій SDK був 1.8і ніAndroid API x


у мене те саме питання. де я повинен це змінити. Дякую
rupesh

1
Коли ви додаєте SDK для Android, вам слід вказати, на який SDK ви посилаєтесь ... (У моєму випадку я вибрав Java 7, тому що використовував цю версію) Але це залежить і у вашому випадку. Шукайте в Інтернеті інші помилки з такою ж назвою, ви знайдете багато інформації
Marco Acierno

ти говориш про екран налаштувань ??
рупеш

3
Відкрийте вікно структури проекту> Де знаходиться вибір із повідомленням «Проект SDK», виберіть потрібний пакет SDK (ваш код або версія SDK, що використовується для компіляції зовнішньої ліб). Якщо у вас є та сама проблема, перевірте лінію SDK для Android та натисніть «Редагувати». Ви перейдете на іншу панель, де у вас є Java SDK, виберіть 1.7 (або версію, яку потрібно скласти)
Marco Acierno

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, коли я додав SDK для Android ... (ви не можете просто вибрати Java 1.x в модулі Android, інакше він не побачить класів Android)
Марко Acierno

15
Чому ми не можемо використовувати java 8?
Sujay


3

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

у плагіні, який є бібліотекою та додатком

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

і в яві

sourceCompatibility= 1.7
targetCompatibility= 1.7

Це було єдине, що мені потрібно було зробити. Спасибі
Чіско

2

Ця проблема виникає, коли ви використовуєте .jar файл, який не використовує жодної функції Java 6 або новішої версії, але був створений за допомогою Java 6 або вище.

Якщо ви створили цей .jarфайл , то вам не потрібно нічого змінювати в Gradleабо ProGuardабо Compiler Version. Рішення дуже просте, просто побудуйте цей .jarфайл заново, але використовуючи Java 5 або менше .

Детальніше .


в моєму випадку це .aar файл. Що я повинен зробити?
GvSharma

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 coz proguard 4.x не підтримує java 8.


@RookieGuy спробуйте встановити версію Java на 1,7, яка також працювала для мене.
spaceMonkey

Дякую за підказку, мені довелося перекомпілювати бібліотеки, які були включені з перехідними залежностями, написав це тут uc-mobileapps.com/index.html%3Fp=509.html для довідки, оскільки версії досить змінилися
RookieGuy

1

У мене була схожа проблема, коли я намагався додати саморобну бібліотеку з netbeans до студії Android. встановлення сумісності джерела та цілі в андроїд-студії та вихідному / двійковому форматі в netbeans (обох!) на java 1.7 вирішило проблему.

в андроїд-студії:

Структура проекту -> Модулі / Додаток -> Властивості -> Джерело та ціль до 1.7

в чистих бобах:

Файл -> Властивості проекту -> Джерела -> Джерело / Бінарний формат до 1,7

потім очистіть і складіть проект netbeans і скопіюйте .jar з "NBProj / dist" в "app / libs"


0

поділіться рішенням випадку, якщо встановлено лише Java8, просто встановіть рівень компілятора Java на 1,7, а потім відновіть проект.


0

Я отримав помилку під час використання сторонньої бібліотеки. Відповідно до вищезазначеного питання, необхідно було замінити бібліотеку відповідно до вищезазначеного повідомлення про відстеження стека:

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

з відповідною версією.

Відповідно на питання, bananaquery.jarйого слід замінити на сумісну з Java версією.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.