错误的类文件魔术或版本


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

该库使用Android API 19 Platform具有项目级别的SDK构建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 2015年

您好,我尝试将整个项目设置为1.6并没有帮助,我之前使用的是该库,我只是将.jar文件更新为较新的版本,这可能是使用较高Java编译的问题吗?
卡萨比

我走了很长的路要解决此问题,并意识到我正在导入的库上发生编译错误。这是一个重要的区别,因为任何本地IDE编译器设置更改都不会修复正在导入的内容。
Shadoninja

Answers:


95

我的JAVA_HOME变量更改为Java 1.8,并且在编译纯Java模块作为我的android项目的依赖项时收到此错误消息。

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 2016年

39

好吧,我的坏。

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

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

在此处输入图片说明

而且似乎编译良好。

今天之前工作的原因是因为我的SDK是1.8Android API x


我有同样的问题。我应该在哪里改变这一点。谢谢
rupesh

1
添加Android SDK时,应指定引用的SDK ...(在我的情况下,选择Java 7是因为我正在使用此版本),但这也取决于您的情况。在线搜索具有相同名称的其他错误,您会发现很多信息
Marco Acierno 2015年

您是否在谈论首选项屏幕?
rupesh

3
打开项目结构窗口>在“项目SDK”消息中进行选择的位置,选择所需的SDK(您的代码或用于编译外部库的SDK版本)。如果您遇到相同的问题,请检查您的Android SDK行,然后单击“编辑”。您将被移至拥有Java SDK的另一个面板,选择1.7(或您需要编译的版本)
Marco Acierno 2015年

2
通过转到“模块设置”并将JDK位置编辑到安装Java 7 jre的主目录中,解决了相同的情况
zztonedefzz 2015年

27

如果人们发现@Marco Acierno的答案不清楚,解决方案是确保您使用Java 7而不是更高版本进行构建。

对于Android Studio,更改File -> Project Structure -> SDK Location -> JDK Locationjdk1.7.x。对于命令行,请确保java -version输出java version "1.7.x"


我使用的是IntelliJ IDEA,因此在我添加Android SDK时,我必须放置正确的Java SDK ...(您不能只在Android Module中选择Java 1.x,否则它将看不到Android类)
Marco Acierno

15
为什么我们不能使用Java 8?
Sujay


3

在每个build.grade文件中将所有模块的Java版本更改为Java 1.7。

在库和应用程序的插件中

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

和在Java中

sourceCompatibility= 1.7
targetCompatibility= 1.7

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

2

当您使用的.jar文件不使用Java 6或更高版本的任何功能,而是使用Java 6或更高版本构建的时,会发生此问题。

如果您构建了该.jar文件,则无需在GradleProGuard或中更改任何内容Compiler 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 2015年

感谢您的提示,我不得不重新编译包含传递依赖项的库,并将其写在此处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兼容版本代替。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.