代码之家  ›  专栏  ›  技术社区  ›  Marco Acierno

错误的类文件魔法或版本

  •  104
  • Marco Acierno  · 技术社区  · 10 年前

    我已经知道这个问题已经被问了很多次,也得到了答案,但我找到的答案中没有一个能解决我的问题。

    这是一个错误:

    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平台 具有项目级别 1.7 .

    我的 .jar 文件在里面 libs/ 文件夹

    我使用IntelliJ IDEA 14预览版,这可能是原因吗?使用IntellIJ IDEA 13,它仍然保持“渐变同步”

    编译文件可能是无用的,因为我有 compile fileTree(dir: 'libs', include: ['*.jar'])

    10 回复  |  直到 10 年前
        1
  •  96
  •   passsy    10 年前

    我的 JAVA_HOME 变量更改为Java1.8,我在编译纯Java模块作为android项目的依赖项时收到了这个错误消息。

    java模块的build.gradle

    apply plugin: 'java'
    

    解决方案1:快速清洗

    我通过设置 JAVA_主页 回到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
    
        2
  •  39
  •   Marco Acierno    10 年前

    好吧,我的错。

    在Project SDK部分中,添加 Android SDK 您应该提供 Java SDK 我所有的Android SDK都使用 Java 8 作为SDK,因此即使Project级别为 1.7 (我不知道为什么,我认为一切都是由项目级别选择的)。

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

    enter image description here

    它似乎编译得很好。

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

        3
  •  27
  •   Chris Lacy    10 年前

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

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

        4
  •  5
  •   Vishal Singh    9 年前

    将JAVA_HOME设置回1.7对我有用。

        5
  •  3
  •   baiiu    9 年前

    在每个build.grade文件中将所有模块java版本更改为java1.7。

    在作为库和应用程序的插件中

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

    和在java中

    sourceCompatibility= 1.7
    targetCompatibility= 1.7
    
        6
  •  2
  •   Bugs Happen    9 年前

    使用 .jar 该文件不使用Java 6或更高版本的任何功能,而是使用Java 6或者更高版本构建的。

    如果你造的 罐子 文件,则无需在中更改任何内容 Gradle ProGuard Compiler Version 。解决方案很简单,只是 建立那个 罐子 文件,但使用Java 5或更低版本 .

    More details .

        7
  •  1
  •   spaceMonkey    9 年前

    我有一个类似的问题,我通过升级我的proguard来解决。 通过以下命令获取proguard版本

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

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

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

    希望这对你有所帮助。 如果你使用java 8,那么你应该升级到proguard 5.x,因为proguard 4.x不支持java 8。

        8
  •  1
  •   RickPat    9 年前

    当我试图将netbeans的自制库添加到androidstudio时,也遇到了类似的问题。将androidstudio中的源和目标兼容性以及netbeans中的源/二进制格式(两者都是!)设置为java1.7解决了这个问题。

    在android工作室中:

    项目结构->模块/应用程序->道具->源和目标为1.7

    在netbeans中:

    文件->项目财产->来源->源/二进制格式设置为1.7

    然后清理并构建netbeans项目,并将.jar从“NBProj/dist”复制到“app/libs”

        9
  •  0
  •   suiwenfeng    8 年前

    如果只安装了Java8,只需将Java编译器级别设置为1.7,然后重新构建项目即可。

        10
  •  0
  •   gotwo    4 年前

    我在使用第三方库时遇到了错误。根据上述问题,有必要根据上述堆栈跟踪消息替换库:

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

    使用适当的版本。

    对应于该问题, bananaquery.jar 将被Java兼容版本取代。