Java System.getProperty返回版本错误及高版本编译Jar可在低版本JDK运行问题
问题排查与解决思路
- 校验jenv实际生效版本
不要仅验证全局java -version输出,在你执行jar包的当前目录执行jenv version,确认输出是否为预期的oracle64-1.8.0.192。jenv支持项目局部版本配置,若当前目录存在.java-version文件,会优先使用文件内指定的Java版本,大概率你执行jar的目录配置了局部Java 11版本。 - 验证编译参数兼容性配置
如果你使用Java 11编译时指定了--release 8、-source 1.8 -target 1.8这类兼容参数,编译产出的字节码本身就支持JDK 8运行,自然不会触发「高版本编译」报错。 - 刷新jenv缓存并校验命令实际指向
安装/卸载JDK后未刷新jenv缓存会导致命令指向异常,先执行jenv rehash刷新缓存,再执行readlink -f $(which java)查看java命令实际指向的二进制文件路径,确认是否真的指向JDK 8的安装目录。 - 检查系统环境变量优先级
若你的shell配置文件(.zshrc/.bash_profile/.bashrc等)中硬编码了JAVA_HOME指向Java 11的安装路径,该配置优先级会高于jenv,执行echo $JAVA_HOME确认路径是否为JDK 8的安装目录,若存在硬编码的JAVA_HOME配置直接删除即可。 - 排查jar包是否内置JRE
若你使用了jlink、自定义spring-boot打包配置等能力,可能会将Java 11的JRE直接内置到可执行jar包中,运行时会优先使用内置JRE,忽略系统配置的Java版本,你可以直接解压jar包确认是否存在JRE相关的内置目录。
内容的提问来源于stack exchange,提问作者todivefor
相关产品推荐
相关产品推荐

