前几天有个关联系统新项目上线,是一个用spring boot 1做的项目,在测试环境测试的非常正常,到了生产发布后,页面调用直接报NoClassDefFoundError,看了下堆栈信息,是没有找到一个关联的Jackson类,查看lib目录是用这个Jackson的jar包且也存在那个类,初步估计是jar包冲突了。好吧,写一个jsp页面通过类加载器来打印出用的是哪个jackson的jar包吧。
打印出来的结果是在weblogic的安装目录下有默认的jackson包,而且版本比工程需要的版本要低,因此调用的时候直接报错了。
虽然问题的原因找到了,但是还是感觉奇怪为啥测试环境没这个情况呢,环境应该一样的呀。再仔细查找发现环境还是有差异的,生产安装的版本是12.2.1.2,测试环境安装的版本是12.2.1.3,还是有一个小版本的差异的。下载了一个12.2.1.2到测试环境上进行验证,果然重现了这个问题。最后把生产的weblogic版本重新安装然后成功上线。
虽然问题已经解决了,但是这种工程里的jar包与web容器的包冲突冲突应该可以通过类加载顺序解决,于是查找了一下weblogic类加载的资料,进行了相关资料查阅后了解到了:
Weblogic的ClassLoader有如下几个层次,按照从高到低顺序排列:
1. JDK Classloader
2. JDK ext Class Loader
3. Weblogic System Class Loader
4. Domain Class Loader(Child of System Class Loader)
5. App Class Loader (负责装载应用中的所有的EJB JAR文件)
6. Web Class Loader