最近在项目迁移到百度服务器环境时发现com.ibm.icu_4.4.2.v20110823.jar包与jdk版本不兼容的问题。
首先看下报错信息,发现NoClassDefFoundError异常。
这里注意,ClassNotFoundException与NoClassDefFoundError的区别:
最主要的是一个是编译时发生的,一个是运行时发生的,前者更容易去解决。显然易见我们是属于后者jvm运行时加载类不能初始化。两者更多的区别大家自行去了解。
而NoClassDefFoundError常见的错误原因无非就以下几种:
- jar包存在冲突,导致找不到,发生NoClassDefFoundError。
- 类路径不正确,jvm无法找到类文件。
- 动态加载类时,类文件不存在
- jdk版本与Jar包兼容问题。
- 也有可能是类静态成员或者静态初始化语句块引起的。
然后一一去排除,首先jar包冲突多发生MAVEN依赖。
类路径不正确问题,通过宝蓝德控制台我们可以看到此jar存在的,路径也是正确的,jvm是可以加载到的。其次本身不是封装的jar而引用的jar,3和5也排除。
后来我查看上面的日志,发现确实与jdk和jar包版本有问题,我很不解只有在百度服务器才会有这种问题,其他服务器都正常。
看我上面标记的红色部分,大概就是版本号无效,超出255或者为负数。然而与下面icu的包有关系。是不是更换icu包或者降低jdk版本就可以了。后来我又在sap的知识库找到一篇类似的帖子。
他这个整体意思是升级了JDK会出现这种问题,要是在SAP平台使用这个jar包jdk需要降低到251版本以下。
因为在别的服务器不会有这种问题,我想使用的百度的服务器是不是也是这种问题,所以就尝试降低了jdk有311到251。
重启实例,发现日志一切正常,信息也正常显示。
问题解决了,我猜测大概与更换了平台服务器有关。com.ibm.icu包与jdk出现了不兼容,只能使用251及以下的版本。