返回信息流先说一下大体框架:
我司发布机跟测试机是两台机器,平时部署的时候是在发布机上打好包,然后发送到测试机上运行(这俩个步骤是通过日志分析出来的,实际部署操作只是点一下发布平台的部署按钮)。
然后是今天的状况:
一个web项目依赖另一个基于thrift的服务项目的client包,这个client都是thrift文件生成的代码。按照正常流程,首先部署client,然后部署web项目,这个流程没问题,但是今天发现web项目在运行时,client的类少了一些字段,从而导致web项目报错。
之所以编译能通过,是因为检查代码后发现并没有哪处代码直接get这个field,所以web页面上发现取不到这个字段的值,就手动加了一行调用get方法的代码,这才出现报错。
然后我们查看client部署时install到本地的jar包,跟web项目的lib里的client jar包的md5完全一样,也就是说client包没问题。
所以现在的问题是 java加载jar包里类的时候会不会因为什么原因丢掉一些field?
这是一条镜像帖。来源:北邮人论坛 / java / #50474同步于 2016/5/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
一个匪夷所思的问题求解
hero210700
2016/5/20镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
【 在 nuanyangyang 的大作中提到: 】
: 哦你是说什么情况下java会删除某些字段?据我所知这不可能。肯定是什么地方文件拷贝错了。
这个文件自从生成之后就从没改过,那个缺少的字段也一直都在,也就是说历史版本上没有什么时候是缺少这个字段的。
而且我们的部署,是在发布机上打好包发到测试机器上,执行start脚本来运行。对比了部署的client和web项目里的client,两者完全一致,同时在运行时用反射打印出来了那个类的所有字段,就是发现少了一个。
综上,就是加载的时候把字段搞丢了。
至于原因,有人说跟jetty的加载机制有关系,可能需要完全杀掉jetty的守护进程神马的,我还没试。。
不太可能吧,我感觉应该不会是这么深的原因导致的,应该是哪里有失误。
序列化/反序列化的时候有没可能丢?
【 在 hero210700 的大作中提到: 】
:
: 这个文件自从生成之后就从没改过,那个缺少的字段也一直都在,也就是说历史版本上没有什么时候是缺少这个字段的。
: 而且我们的部署,是在发布机上打好包发到测试机器上,执行start脚本来运行。对比了部署的client和web项目里的client,两者完全一致,同时在运行时用反射打印出来了那个类的所有字段,就是发现少了一个。
: ...................
这里并没有涉及到序列化问题,对于web项目来说仅仅是加载了一个类而已,并且这个类文件本身是不缺字段的
【 在 lzrak47 的大作中提到: 】
: 不太可能吧,我感觉应该不会是这么深的原因导致的,应该是哪里有失误。
: 序列化/反序列化的时候有没可能丢?
:
你现在排查出来了吗?
【 在 hero210700 的大作中提到: 】
: 这里并没有涉及到序列化问题,对于web项目来说仅仅是加载了一个类而已,并且这个类文件本身是不缺字段的
没有 我看现在dev不报错了 貌似是恢复了 中间有其他人部署了几次 可能会有关系 得检查下这部分代码有没有修改才能确定
如果代码没有修改 就只能认为是jetty造成的,否则就是有其他原因了
【 在 lzrak47 的大作中提到: 】
: 你现在排查出来了吗?
【 在 hero210700 的大作中提到: 】
: 先说一下大体框架:
: 我司发布机跟测试机是两台机器,平时部署的时候是在发布机上打好包,然后发送到测试机上运行(这俩个步骤是通过日志分析出来的,实际部署操作只是点一下发布平台的部署按钮)。
: 然后是今天的状况:
: ...................
肯定是你打web项目的包时,没有先重新打client的包