BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #50474同步于 2016/5/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

一个匪夷所思的问题求解

hero210700
2016/5/20镜像同步8 回复
先说一下大体框架: 我司发布机跟测试机是两台机器,平时部署的时候是在发布机上打好包,然后发送到测试机上运行(这俩个步骤是通过日志分析出来的,实际部署操作只是点一下发布平台的部署按钮)。 然后是今天的状况: 一个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?
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
nuanyangyang机器人#1 · 2016/5/20
java有反射。很多基于反射的框架(比如spring)都会动态地去调用get方法
nuanyangyang机器人#2 · 2016/5/20
哦你是说什么情况下java会删除某些字段?据我所知这不可能。肯定是什么地方文件拷贝错了。
hero210700机器人#3 · 2016/5/21
【 在 nuanyangyang 的大作中提到: 】 : 哦你是说什么情况下java会删除某些字段?据我所知这不可能。肯定是什么地方文件拷贝错了。 这个文件自从生成之后就从没改过,那个缺少的字段也一直都在,也就是说历史版本上没有什么时候是缺少这个字段的。 而且我们的部署,是在发布机上打好包发到测试机器上,执行start脚本来运行。对比了部署的client和web项目里的client,两者完全一致,同时在运行时用反射打印出来了那个类的所有字段,就是发现少了一个。 综上,就是加载的时候把字段搞丢了。 至于原因,有人说跟jetty的加载机制有关系,可能需要完全杀掉jetty的守护进程神马的,我还没试。。
lzrak47机器人#4 · 2016/5/24
不太可能吧,我感觉应该不会是这么深的原因导致的,应该是哪里有失误。 序列化/反序列化的时候有没可能丢? 【 在 hero210700 的大作中提到: 】 : : 这个文件自从生成之后就从没改过,那个缺少的字段也一直都在,也就是说历史版本上没有什么时候是缺少这个字段的。 : 而且我们的部署,是在发布机上打好包发到测试机器上,执行start脚本来运行。对比了部署的client和web项目里的client,两者完全一致,同时在运行时用反射打印出来了那个类的所有字段,就是发现少了一个。 : ...................
hero210700机器人#5 · 2016/5/24
这里并没有涉及到序列化问题,对于web项目来说仅仅是加载了一个类而已,并且这个类文件本身是不缺字段的 【 在 lzrak47 的大作中提到: 】 : 不太可能吧,我感觉应该不会是这么深的原因导致的,应该是哪里有失误。 : 序列化/反序列化的时候有没可能丢? :
lzrak47机器人#6 · 2016/5/24
你现在排查出来了吗? 【 在 hero210700 的大作中提到: 】 : 这里并没有涉及到序列化问题,对于web项目来说仅仅是加载了一个类而已,并且这个类文件本身是不缺字段的
hero210700机器人#7 · 2016/5/24
没有 我看现在dev不报错了 貌似是恢复了 中间有其他人部署了几次 可能会有关系 得检查下这部分代码有没有修改才能确定 如果代码没有修改 就只能认为是jetty造成的,否则就是有其他原因了 【 在 lzrak47 的大作中提到: 】 : 你现在排查出来了吗?
mimi101cat机器人#8 · 2016/5/26
【 在 hero210700 的大作中提到: 】 : 先说一下大体框架: : 我司发布机跟测试机是两台机器,平时部署的时候是在发布机上打好包,然后发送到测试机上运行(这俩个步骤是通过日志分析出来的,实际部署操作只是点一下发布平台的部署按钮)。 : 然后是今天的状况: : ................... 肯定是你打web项目的包时,没有先重新打client的包