糟糕的类文件格式或版本

104

我已经知道这个问题已经被问得非常频繁,并且也有很多答案,但是我找到的答案都没有解决我的问题。

错误信息如下:

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

编译SDK为19,构建工具版本为'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']),因此compile files可能没有用处。


嗨,我有类似的问题,但将项目编译器设置为1.7并没有帮助,请您能否看一下?http://stackoverflow.com/questions/29098038/errorexecution-failed-for-task-appdexdebug-error-code-1-com-android-dx-cf - Csabi
问题可能有很多种,我使用1.7是因为我在使用Java 1.7,尝试将其更改为1.6。 - Marco Acierno
嗨,我尝试将整个项目放入1.6中,但没有帮助。我之前使用过该库,只是更新了.jar文件为新版本。这可能是由于它使用更高的Java编译而导致的问题? - Csabi
我经过漫长的修复过程后发现编译错误出现在我正在导入的库上。这是一个重要的区别,因为没有本地IDE编译器设置更改能够解决被导入的问题。 - Shadoninja
10个回答

96

当我将JAVA_HOME变量更改为Java 1.8并在我的Android项目的依赖中编译纯Java模块时,我遇到了此错误消息。

Java模块的build.gradle文件。

apply plugin: 'java'

解决方案#1: 快速而不彻底

我通过将JAVA_HOME设置回1.7来解决了这个问题:

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

解决方案 #2:更改编译器版本:

在build.gradle文件中将特定模块的编译器版本更改回1.7。

apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7

4
在 Gradle 的实验版本中,语法为:compileOptions.with { sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7 } - Stephen Kaiser
解决方案2对我有效,尽管Android Studio在sourceCompatibility和targetCompatibility下面用灰色下划线标出并显示“未使用分配”。 - CodyF

39

好的,我的错。

在项目SDK部分,当您添加Android SDK时,您应该提供Java SDK,而我的所有Android SDK都使用Java 8 作为SDK,因此即使项目级别为1.7(我不知道为什么,我认为一切都是按照项目级别选择的),也会创建错误版本的类文件。

现在我改变了SDK(java version "1.x.0"部分)。

输入图像描述

看起来编译顺利。

之前能工作的原因是因为我的SDK是1.8而不是Android API x


1
当您添加Android SDK时,应指定您所引用的SDK版本...(在我的情况下,我选择了Java 7,因为我正在使用此版本)但这也取决于您的情况。在网上搜索其他具有相同名称的错误,您会找到大量信息。 - Marco Acierno
你在说偏好设置屏幕吗? - rupesh
3
打开项目结构窗口 > 在带有“Project SDK”消息的选择器中选择您需要的SDK(您的代码或用于编译外部库的SDK版本)。 如果您遇到了与我一样的问题,请检查您的Android SDK行并单击“编辑”。 您将被移至另一个面板,在那里您会看到Java SDK,请选择1.7(或您需要编译的版本)。 - Marco Acierno
2
通过进入模块设置并将JDK位置编辑为安装了Java 7 jre的主目录,解决了相同的情况。 - zztonedefzz
哥们,你刚刚解决了我3个小时的烦恼。虽然我在使用AIR-Android-ANE,但是你的解决方案解决了我的问题。 - Deko
显示剩余4条评论

27
如果有人觉得 @Marco Acierno 的回答有点不清楚,那么解决方案就是确保你使用的是 Java 7 版本而不是更高的版本。
对于 Android Studio,请将 文件 -> 项目结构 -> SDK位置 -> JDK位置 更改为 jdk1.7.x。对于命令行,请确保 java -version 输出的结果是 java version "1.7.x"

我使用的是IntelliJ IDEA,因此在我的情况下,当我添加Android SDK时,必须放置正确的Java SDK...(否则,您不能仅在Android模块中选择Java 1.x,否则它将无法看到Android类)。 - Marco Acierno
16
为什么我们不能使用Java 8? - Sujay

5
将JAVA_HOME设置回1.7对我有用。

3

请将所有build.gradle文件中的模块Java版本更改为Java 1.7。

在库和应用程序中的插件中进行更改。

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

在Java中,...
sourceCompatibility= 1.7
targetCompatibility= 1.7

这是我唯一需要做的事情。谢谢。 - Chisko

2
当您使用一个未使用Java 6或更高版本的任何功能但是使用Java 6或更高版本构建的.jar文件时,就会出现此问题。
如果您构建了该.jar文件,则无需更改GradleProGuardCompiler Version中的任何内容。解决方案非常简单,只需再次使用Java 5或更低版本构建.jar文件即可。 更多细节

在我的情况下,它是 .aar 文件。我该怎么办? - GvSharma

1

我遇到了类似的问题,通过升级我的Proguard解决了它。 使用以下命令获取您的Proguard版本。

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

从这里获取最新的progaurd.jar文件(http://proguard.sourceforge.net)。

用新的.jar文件替换现有的android-sdks/tools/proguard/lib/proguard.jar。

希望这能帮到你。 如果您正在使用Java 8,则应升级到proguard 5.x,因为proguard 4.x不支持Java 8。


@RookieGuy 尝试将Java版本设置回1.7,这对我也起作用了。 - spaceMonkey
谢谢您的提示,我必须重新编译包含传递依赖项的库。这里写了详细内容以备参考:http://www.uc-mobileapps.com/index.html%3Fp=509.html ,因为版本已经有了很大变化。 - RookieGuy

1

当我尝试将NetBeans中的自制库添加到Android Studio时,遇到了类似的问题。在Android Studio中将源和目标兼容性以及在NetBeans中的源/二进制格式(两者都)设置为Java 1.7解决了该问题。

在Android Studio中:

项目结构 -> 模块/应用程序 -> 属性 -> 将源和目标设置为1.7

在NetBeans中:

文件 -> 项目属性 -> 源 -> 将源/二进制格式设置为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 兼容版本替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接