依赖正式包,应用就稳了吗

简介: 记一次主干分支部署启动失败的排查。   起因 一天在电脑前安静的写代码,突然收到消息说「你上次发布是不是有问题,现在从 master 新拉的分支在预发部署不起来了」。 报错如下 Caused by: java.lang.IllegalStateException: Unable to load cache item at org.springfra

记一次主干分支部署启动失败的排查。

 

起因

一天在电脑前安静的写代码,突然收到消息说「你上次发布是不是有问题,现在从 master 新拉的分支在预发部署不起来了」。

报错如下

Caused by: java.lang.IllegalStateException: Unable to load cache item
        at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:79)
        at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)
        at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116)
        at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291)
        at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:480)
        at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:337)
        at org.springframework.context.annotation.ConfigurationClassEnhancer.createClass(ConfigurationClassEnhancer.java:138)
        at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:110)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:394)
        ... 20 more
Caused by: java.lang.NoClassDefFoundError: com/alibaba/mcms/boot/service/interfaces/McmsResourceService
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
        at java.lang.Class.getDeclaredMethods(Class.java:1975)

 

过程

round 1

McmsResourceService 属于 mcms-spring-boot-starter 这个包,作为一个有经验的的 Javaer,看到这个报错,第一反应是包冲突导致类找不到了。然而 checkout 到相应分支,看了下依赖关系,发现并没有依赖这个包,更别说多版本了。登线上机器验证,发现线上的 lib 目录下是有这个包的。好说,那应该是应用依赖了某个 snapshot 版本的二方包,然后从发布到现在该二方包有变更,导致依赖丢了。

 

然而这时候有同学发了这样一张图(现在看应该是他本地相关主 pom 没有更新,所以保留了这个依赖关系)。

round 2

看图可知这个二方包是这样被引入的,而且是通过正式包引入的。那么上面的猜想不成立了。

 

无妨,再针对这几个包对比下线上和预发的版本。发现线上的 common 是 1.1.1,而预发是 1.1.2 了。看了下 common 的 pom 文件,1.1.2 版本的确是显式地把 mcms-spring-boot-starter 给排掉了,而低版本还是在的。

 

再看下为什么 common 的版本号会变呢?common 是被 client 引入的,看下 client 的 pom 文件

  ...
  <parent> 
    <groupId>com.wdk.backend</groupId>  
    <artifactId>wdk-qualification-center</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <relativePath>../pom.xml</relativePath> 
  </parent>  

  <modelVersion>4.0.0</modelVersion>  
  <groupId>com.wdk.backend</groupId>  
  <artifactId>wdk-qualification-center-client</artifactId>  
  <version>1.1.1</version>  
  <packaging>jar</packaging>  
  <name>wdk-qualification-center-client</name>  

  <dependencies> 
    <dependency> 
      <groupId>com.wdk.backend</groupId>  
      <artifactId>wdk-qualification-center-common</artifactId> 
    </dependency>  
    ...

 

common 版本是定义在父 pom 里的,父 pom 是 SNAPSHOT 版本。看了下本地仓库的父 pom 的确在最近有升级,提升了 common 的版本。

image.png

 

至此,问题定位清楚了。

 

总结

  1. 大家发布正式二方包的时候,父 pom 也记得升一下吧
  2. 这次问题排查还是比较顺利的,因为那张图保留了现场。如果没有那张图,怎么定位?我想到的一个思路:mcms-spring-boot-starter 这个包被引入和被排除是确定的,只是不知道是在那个二方包的 pom 文件引入和排除的。那也好办,把 lib 下面的 jar 全部解压,然后用关键字搜索所有的 pom.xml 文件,应该能找到相应的线索。如果大家有更简单的思路欢迎留言
目录
相关文章
|
3月前
|
机器学习/深度学习 算法 Python
引入相关依赖的包
【8月更文挑战第7天】引入相关依赖的包。
42 11
|
13天前
|
缓存 前端开发 JavaScript
前端架构思考:代码复用带来的隐形耦合,可能让大模型造轮子是更好的选择-从 CDN 依赖包被删导致个站打不开到数年前因11 行代码导致上千项目崩溃谈谈npm黑洞 - 统计下你的项目有多少个依赖吧!
最近,我的个人网站因免费CDN上的Vue.js包路径变更导致无法访问,引发了我对前端依赖管理的深刻反思。文章探讨了NPM依赖陷阱、开源库所有权与维护压力、NPM生态问题,并提出减少不必要的依赖、重视模块设计等建议,以提升前端项目的稳定性和可控性。通过“left_pad”事件及个人经历,强调了依赖管理的重要性和让大模型代替人造轮子的潜在收益
|
6月前
|
Java Maven
【亮剑】Java项目开发中常遇到Jar 包依赖冲突问题,主要由不同版本库、循环依赖、传递依赖和依赖范围不当引起
【4月更文挑战第30天】Java项目开发中常遇到依赖冲突问题,主要由不同版本库、循环依赖、传递依赖和依赖范围不当引起。解决冲突需分析依赖树、定位冲突源、调整类加载顺序等。方法包括排除冲突依赖、统一管理版本、限定依赖范围、合并冲突类、升级降级库版本及拆分模块。关注依赖关系,及时解决冲突,保障项目稳定运行。
403 0
|
6月前
|
缓存 Java Maven
Maven找不到依赖终极解决方案
Maven找不到依赖终极解决方案
575 0
|
6月前
|
存储 资源调度 JavaScript
好包不等待:用 pnpm 加速你的项目依赖
好包不等待:用 pnpm 加速你的项目依赖
424 0
|
6月前
|
测试技术
路径依赖效应
路径依赖效应
147 0
|
Cloud Native Java Go
解决Maven依赖下载问题:从阿里云公共仓库入手
解决Maven依赖下载问题:从阿里云公共仓库入手
1177 0
|
Java Maven
项目导入依赖后,还是用不了包的一个解决思路
项目导入依赖后,还是用不了包的一个解决思路
542 0
|
Java Maven
springboot依赖分离,本地代码和第三方依赖包分开,减少部署服务时的上传时间
在pom.xml中的<build>标签中的<plugins>标签中添加下面这个插件
|
运维 供应链 前端开发
化繁为简,如何快速实现企业级私有 npm 包依赖管理服务?
化繁为简,如何快速实现企业级私有 npm 包依赖管理服务?
133 0