采购包在发版前测试环境出现jdk版本问题:
nested exception is java.lang.UnsupportedClassVersionError: javax/annotation/ManagedBean : Unsupported major.minor version 52.0
看问题是jdk1.7环境下运行jdk1.8的依赖包,搜索发现这个ManagedBean是javaee7里面的(javaee是一种标准规范,tomcat会实现其规范),tomcat实现javaee7规范依赖的是jdk1.8。这个服务以前都正常使用,也就是最近才出现问题的,那么可能最近别人升级了api相关依赖导致api依赖传递的问题。
那么现在有两个问题:1、什么包导致了基础的javaee的升级?2、哪个api导致的呢?
看dubbo中lib目录发现有springboot2.x的相关服务包(如下图)
springboot2.x最低依赖是jdk1.8,其他包看起来都正常。所以猜测是springboot导致javaee升级了版本,所以现在要处理掉springboot问题。利用maven tree以及Dependency Analyzer都没有发现springboot相关依赖,只能其他办法处理。
有两种解决方法:
1、直接在打包时候排除掉springboot依赖(dubbo可以在assembly.xml,接入层可以添加maven-war-plugin插件)
2、直接找到相关依赖然后要求提供方排除所有(在maven中添加true)。其中方法1处理快但是只能治标,方法2处理慢能够治本,长期来讲能够规范开放api。
为了快速解决发版问题直接选择第1种,发版到测试环境发现但是还是存在上述问题。那接着使用第2种方法,注释掉相关依赖然后本地install,不断修改其他依赖重复install,最后发现商品比价服务传递依赖导致的(在注释maven依赖后避免报错可以先把本地代码先删掉;通过二分法排查依赖还是很快的)。先删掉相关依赖注释相关代码,发布到测试环境后发现上述错误没有了。
由此可以确定是比价这个服务导致的,回到比价服务下发现他们本地也存在这个问题,比价这个服务api查看发现依赖财务爬虫服务的api;直接去掉再打包就没有springboot2.x,所以最终确定是爬虫服务导致的问题,而爬虫服务今天刚好升级了版本。让爬虫服务回退版本deploy api,比价deploy api采购重新打包发布业务正常
结论:
该问题是典型的多服务依赖传递的问题,为了规避这样的问题,我们开放的api必须是干净的,可以如下操作:
1.在我们自己的api中把依赖别人的api全部排除掉并设置为true,这样我们给别人的api就不会存在依赖传递的情况
2.在api层尽量不要直接调用其他人,如果需要使用相关实体可以本地写一份相对应的实体在服务层拷贝处理即可