高版本JDK的坑-ClassNotFound


如果使用高版本的JDK启动jar包的时候,可能会遇到一些莫名其妙的问题,所以Java当前吹的永远向前兼容的牛逼算是吹破了。今天我就遇到了.
一开我使用java -jar xxxxx.jar 启动的时候会报出一些JVM启动参数问题,觉得莫名其妙,命名本地可以启动,为什么到了服务器上就启动不了呢?
于是第一时间想到了查看一下java的版本

root@xr-travelse-arm-vm01:~# java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3, mixed mode)

结果发现居然装的是java 11. 这个版本我们生产环境从未用过,本想正重装Java8来解决,但是难道以后都不升级了么,所以这个问题一定要弄明白,于是乎goole了一下发现java8 以后的jvm虚拟机去掉了好几个jvm配置参数,那是因为jdk8以后版本的jvm开始做减法了,去掉了一些功能.例如 配置

#local JVM_HEAP="-XX:NewRatio=1 -XX:SurvivorRatio=8 -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=64m -XX:+HeapDumpOnOutOfMemoryError -XX:ReservedCodeCacheSize=64m -XX:InitialCodeCacheSize=64m"

配置这些在java8中是没问题的,但是配置在java11中会导致服务启动不了。因为有些参数已经废弃掉了,或者改用了其他的方式来配置。

另外,还会出现一个现象,就是引用启动没有问题,但是程序就是运行不了,而且不打印异常堆栈信息,这你怎么排查!!!我没办法只要远程调试,断点执行,才发现一个异常。
最后还是使用java8吧先,有时间在研究java11.


评论