资讯中心

小米面试官必问:项目明明设置了 JDK 21,Maven 为什么还会被 JDK 25 编译崩?一篇讲透 TypeTag UNKNOWN!

📅 2026/7/27 13:51:26
小米面试官必问:项目明明设置了 JDK 21,Maven 为什么还会被 JDK 25 编译崩?一篇讲透 TypeTag UNKNOWN!
大厂面试官必问项目明明设置了 JDK 21Maven 为什么还会被 JDK 25 编译崩一篇讲透 TypeTag UNKNOWN在使用 Maven 打包 Spring Boot 项目时我遇到了下面这个错误Failed to execute goal maven-compiler-plugin:3.13.0:compile Fatal error compiling: java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTag :: UNKNOWN执行的命令是mvn-U clean package更奇怪的是项目明明已经设置propertiesjava.version21/java.version/propertiesIDEA 的项目 JDK 也是21为什么编译依然失败一、真正的原因Maven实际使用了 JDK 25执行下面的命令mvn-version当时得到的结果是Apache Maven 3.9.16 Java version: 25.0.2 runtime: E:\apps\Java\jdk-25.0.2这说明虽然项目目标版本是 Java 21但运行 Maven 的 Java环境实际上是 JDK 25。需要区分三个概念IDEA Project SDK → IDEA用于分析和编译项目的JDK java.version21/java.version → 项目要求生成兼容Java 21的代码 mvn -version中的Java version → Maven进程真正运行在什么JDK上它们可以不是同一个版本。日志中的javac [release 21]只表示生成兼容 Java 21的字节码不代表 Maven本身运行在 JDK 21上。二、为什么会出现 TypeTag UNKNOWN项目使用了dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.36/version/dependencyLombok不是普通工具类它会在编译期间作为注解处理器运行并访问javac的内部实现。JDK升级后javac的内部类和字段可能发生变化。当前项目中的 Lombok版本与实际运行 Maven的 JDK 25存在兼容问题因此在初始化时找不到预期的com.sun.tools.javac.code.TypeTag.UNKNOWN最终抛出ExceptionInInitializerError所以这不是业务代码错误也不是 Maven版本太高而是Maven运行JDK版本 与 Lombok注解处理器兼容范围 不匹配三、为什么优先把 Maven切换到 JDK 21这个项目本身使用Spring Boot 3.4.4 Java 21教程和项目配置都以 JDK 21为基准因此最稳妥的方法是让IDEA JDK 项目目标 JDK Maven运行 JDK全部统一为 JDK 21。不建议优先降级 Maven因为 Maven 3.9.16本身可以正常运行项目真正冲突的是 JDK 25和编译期工具。四、临时解决方法在 PowerShell中执行$env:JAVA_HOME C:\Users\12047\.jdks\corretto-21.0.12$env:Path $env:JAVA_HOME\bin;$env:Path然后验证java-version mvn-version两者都应该显示 Java 21。最后重新编译mvn-U clean package不过这种修改只对当前 PowerShell窗口有效关闭窗口后就会失效。五、永久解决方法在 Windows用户环境变量中添加变量名JAVA_HOME 变量值C:\Users\12047\.jdks\corretto-21.0.12然后在用户变量Path中添加%JAVA_HOME%\bin如果Path中还存在E:\apps\Java\jdk-25.0.2\bin需要删除或者把%JAVA_HOME%\bin移到它前面。设置完成后关闭并重新打开 PowerShell和 IDEA再执行java-version mvn-version确认两者全部使用 JDK 21。六、面试时应该怎么回答如果面试官问“项目配置的是 Java 21为什么 Maven还能使用 JDK 25”可以回答java.version主要控制项目的目标编译版本而 Maven进程使用哪个 JDK由启动环境决定通常受到JAVA_HOME和Path的影响。即使设置了release 21Maven仍可能运行在 JDK 25上。Lombok等注解处理器会直接与当前运行环境中的javac交互因此可能因为 JDK内部API变化而出现兼容错误。七、总结本次错误的完整原因是Maven通过JAVA_HOME使用了JDK 25 ↓ Lombok 1.18.36进入编译阶段 ↓ 访问JDK 25中的javac内部API ↓ 出现TypeTag UNKNOWN兼容错误 ↓ Maven编译失败最终解决方式不是修改业务代码也不是降级 Maven而是将 Maven运行环境统一切换到 JDK 21。以后看到下面这种错误ExceptionInInitializerError com.sun.tools.javac... TypeTag :: UNKNOWN第一时间执行mvn-version先确认 Maven到底使用了哪个 JDK往往比盲目修改代码更快找到真正原因。