编译器 (Java1.8.0_281) 中出现异常错误属性`MODULE`

1,299 阅读2分钟

问题整理

1. 问题描述

在尝试使用Java 8 (1.8.0_281) 编译项目时遇到了一个编译错误,具体错误信息如下:

> Task :launcher:compileDebugJavaWithJavac FAILED
编译器 (1.8.0_281) 中出现异常错误。...
java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE (class com.sun.tools.javac.util.UnsharedNameTable$NameImpl)
        at com.sun.tools.javac.util.Assert.error(Assert.java:133)
        at com.sun.tools.javac.code.TypeAnnotations.annotationType(TypeAnnotations.java:231)
        at com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.separateAnnotationsKinds(TypeAnnotations.java:294)
        at com.sun.tools.javac.code.TypeAnnotations$TypeAnnotationPositions.visitVarDef(TypeAnnotations.java:1164)
        at com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:852)
        at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)`
...

这个错误表明Java 8的编译器在处理Java源代码时遇到了一个它不识别的属性MODULE,这通常是因为源代码中使用了Java 9及以上版本中引入的特性(如模块系统),而Java 8的编译器无法处理这些新特性。

2. 原因分析

错误的原因是项目中的某些Java文件使用了Java 9或更高版本中引入的语法或特性(如Jigsaw Project中的模块系统),这些特性在Java 8中是不被支持的。具体来说,MODULE是Java 9中引入的模块系统的一部分,用于定义模块的名称、依赖等。

3. 处理方法

为了解决这个问题,可以采取以下几种方法:

  1. 升级Java版本

    • 将项目的JDK版本升级到Java 11或更高版本。这是最直接的方法,因为这样可以确保编译器能够处理所有新的Java语法和特性。
    • 在你的IDE(如IntelliJ IDEA, Eclipse等)中更改项目的JDK设置,确保它指向一个Java 11或更高版本的JDK。
  2. 修改源代码

    • 如果升级JDK版本不可行,那么需要检查并修改项目中所有使用了Java 9及以上特性的代码。这可能包括移除模块声明、改用传统的包和类导入方式等。
    • 这种方法可能比较复杂,因为它需要对代码进行深入的审查和修改。
  3. 配置IDE以兼容Java 8

    • 如果项目必须使用Java 8,那么需要确保IDE和所有构建工具(如Gradle, Maven等)都配置为使用Java 8。
    • 同时,需要确保源代码中没有使用任何Java 9及以上版本的特性。

实际操作步骤(以升级JDK为例)

  1. 下载并安装Java 11

    • 从Oracle官网或其他可信源下载Java 11 JDK。
    • 安装JDK并配置环境变量(如JAVA_HOMEPATH)。
  2. 更改IDE的JDK设置

    • 打开IDE(如IntelliJ IDEA, Eclipse等)。
    • 进入项目设置,找到JDK配置部分。
    • 将项目的JDK设置为刚安装的Java 11 JDK。
  3. 重新构建项目

    • 清理并重新构建项目,以确保所有设置都已生效。
    • 检查是否还有编译错误,并相应地调整代码或配置。

IDE中设置JDK的截图 (注意:此截图仅为示例,实际操作界面可能有所不同。)