同事在服务器上敲java -version,出来一行1.8.0_181,问我这算不算Java 8。算,1.8就是8,下划线后面那串是补丁号。真正麻烦的不是读这个数字,而是同一台机器上装了三个JDK,命令跑的和项目要的不是同一个。

版本号拆开看

1.8.0_181分成四段:1是大版本,8是特性版本,0是中间位,181是更新号,也就是常说的8u181。这里有个坑要记住,8u202是最后一个可以免费商用的Oracle JDK 8,从8u211起换了许可协议,公司里跑生产环境要么买授权,要么换OpenJDK或者Adoptium的构建。

java和javac不是一回事

java -version看的是运行时,javac -version看的是编译器。两者不一致时最典型的报错是UnsupportedClassVersionError,后面跟着52.0这种数字。52对应Java 8,53是9,55是11,61是17。看到这个错别去改代码,先确认跑程序的那个java到底是哪个文件。

JAVA_HOME和Path谁说了算

where java  set JAVA_HOME  echo %Path%

Windows下where java会按Path顺序列出所有java.exe,排在前面的生效。很多机器装完新JDK,Path里还留着C:/ProgramData/Oracle/Java/javapath,那是安装时写进去的转发器,永远指向最后一次安装的版本。把JAVA_HOME设成实际目录,Path里只留%JAVA_HOME%/bin,比来回调顺序干净。

卸载装新版后命令还是旧的

Oracle的JDK安装时会往C:/Windows/System32塞java.exe、javaw.exe、javaws.exe三个副本,卸载时不一定清干净。装完新版敲java还是老版本号,就是这三个文件在捣鬼。删掉它们,再确认Path里没有别的Java目录。

编译级别三处要一致

pom里的maven.compiler.source和target写1.8,IDE里的SDK却是11,编译能过,跑起来照样炸。反过来SDK是8、代码里用了var,编译直接报错。项目SDK、编译插件参数、服务器JRE,这三处对齐了才省心。

  • 只跑不编:装JRE就够,体积小一半。
  • 老系统维护:锁死8u202,别随手升到8u3xx,部分反射调用可能会被拦。
  • 新项目:直接上17或者21,8的免费支持早就到期了。