最可靠方式是直接查pom.xml配置并结合命令行验证:先检查中maven.compiler.source/target或中source/target值,再用mvn -x compile看javac参数,最后用javap -verbose确认class文件major version(如61对应java 17)。

直接看 pom.xml 里的配置,再结合命令行验证,是最可靠的方式。只靠 java -version 或 IDE 显示容易误判,因为 Maven 编译实际用的 JDK 可能和系统默认不同。
查 pom.xml 中的编译版本声明
项目级配置通常有两类写法,都需检查:
-
通过
<properties></properties>声明:在<project></project>根节点下找类似内容:<maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target>
这两个值决定了源码语法支持范围和生成 class 文件的字节码版本(如 Java 17 对应 class 文件版本 61)。 -
通过
maven-compiler-plugin配置:在<build><plugins></plugins></build>中查找插件块,重点看:<source>17</source>和<target>17</target>。
若两者存在且与<properties></properties>不一致,插件配置优先级更高。
运行 mvn compile 并观察日志输出
执行编译命令时加 -X 参数可显示详细过程:
- 运行
mvn -X compile 2>&1 | grep -i "javac"(Linux/macOS)或mvn -X compile | findstr /i "javac"(Windows) - 日志中会出现类似:
[DEBUG] Using compiler 'javac'.<br> [DEBUG] Source directory: xxx<br> [DEBUG] Command line options: ... -source 17 -target 17 ...
- 如果配置了
<executable></executable>或使用了toolchains,这里还会打印出具体调用的javac路径,比如/opt/jdk-17.0.2/bin/javac。
检查实际生成的 class 文件版本
编译完成后,用 javap -verbose 查看任意一个 class 文件的主次版本号:
- 执行:
javap -verbose target/classes/YourClass.class | grep "major version" - 输出示例:
major version: 61→ 对应 Java 17(Java 8 是 52,Java 11 是 55,Java 17 是 61,Java 21 是 65) - 这个数字是最终结果,不受
JAVA_HOME或 IDE 设置干扰,最权威。
留意 toolchains 和环境变量的影响
若项目用了 maven-toolchains-plugin,仅看 pom.xml 不够:
- 确认用户目录下
~/.m2/toolchains.xml是否存在,且其中<jdkhome></jdkhome>指向了你预期的 JDK 路径 - 检查
pom.xml中是否启用了 toolchain,例如:<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-toolchains-plugin</artifactid><executions>...</executions></plugin> - 此时
mvn -X compile日志里会明确提示 “Using toolchain: jdk version 17” 并列出路径











