记一次由apollo jar包版本冲突导致的NoSuchMethodError错误

事件链接

现象:

服务始终发不成功,即使是以前发布成功的commit, 这会也发不上去了。同时Sentry里有多次报错:
NoSuchMethodError
com.ctrip.framework.apollo.Config.addChangeListener(Lcom/ctrip/framework/apollo/ConfigChangeListener;Ljava/util/Set;)V

com.leyantech.utility.concurrent.DynamicThreadPools in setThreadPoolDynamicallyConfigurable at line 130
com.leyantech.utility.concurrent.DynamicThreadPools in create at line 89
com.leyantech.utility.concurrent.DynamicThreadPools in create at line 100
com.leyantech.gaia.server.Gaia in createDefaultExecutor at line 339

分析过程:

吉老师:看上去和 apollo 版本有关,以致于运行时的 apollo class 版本不对。pom.xml里apollo的版本很久没动过了。不过近期 gaia 的运行时新增了一些功能,可能刚好用到了项目P 以前没依赖到的 apollo 版本,所以先拉下 项目P 的代码分析。

进 项目P 的容器把 jar 包打开,反编译了一下相关 class,结果如下:

public interface com.ctrip.framework.apollo.Config {
  public abstract java.lang.String getProperty(java.lang.String, java.lang.String);

  public abstract java.lang.Integer getIntProperty(java.lang.String, java.lang.Integer);

  public abstract java.lang.Long getLongProperty(java.lang.String, java.lang.Long);

  public abstract java.lang.Short getShortProperty(java.lang.String, java.lang.Short);

  public abstract java.lang.Float getFloatProperty(java.lang.String, java.lang.Float);

  public abstract java.lang.Double getDoubleProperty(java.lang.String, java.lang.Double);

  public abstract java.lang.Byte getByteProperty(java.lang.String, java.lang.Byte);

  public abstract java.lang.Boolean getBooleanProperty(java.lang.String, java.lang.Boolean);

  public abstract java.lang.String[] getArrayProperty(java.lang.String, java.lang.String, java.lang.String[]);

  public abstract java.util.Date getDateProperty(java.lang.String, java.util.Date);

  public abstract java.util.Date getDateProperty(java.lang.String, java.lang.String, java.util.Date);

  public abstract java.util.Date getDateProperty(java.lang.String, java.lang.String, java.util.Locale, java.util.Date);

  public abstract <T extends java.lang.Enum<T>> T getEnumProperty(java.lang.String, java.lang.Class<T>, T);

  public abstract long getDurationProperty(java.lang.String, long);

  public abstract void addChangeListener(com.ctrip.framework.apollo.ConfigChangeListener);

  public abstract java.util.Set<java.lang.String> getPropertyNames();
}

从反编译结果来看,确实没有 com.ctrip.framework.apollo.Config.addChangeListener(Lcom/ctrip/framework/apollo/ConfigChangeListener;Ljava/util/Set;) 这个方法,只有 public abstract void addChangeListener(com.ctrip.framework.apollo.ConfigChangeListener)

而gaia 里依赖的 apollo client 版本是 1.7.1 ,确实是有相关方法的,如下图红框内所示:
在这里插入图片描述

解决办法:

把项目P依赖的apollo client 版本升级至1.7.1后,问题解决

建议:

基础组件的版本管理,例如apollo,es,redis等基础组件,最好在基础架构的包里去管理,类似于spring-boot(注:本项目没有用spring全家桶,而是用的ninja+juice),在基础包里做好依赖管理,避免依赖管理混乱,造成一些潜在问题。但这不是单一团队的事情,需要各个团队配合升级才好做。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值