记一次测试环境项目启动异常

415 阅读2分钟

起因

在一次本地代码测试完成之后,信心满满的上传到测试环境,启动项目。刚启动就满屏的错误

启动报错
查看报错,可见是由于缺失 SqlMapClientFactoryBean 导致的启动异常。尝试在本地再一次启动项目,项目正常启动。那为什么在测试环境就会启动异常?带着不解,搜索 SqlMapClientFactoryBean ClassNotFoundException 相关问题,发现 SqlMapClientFactoryBean 用于 SpringIbatis 整合,但是在 Spring4 之后,已不再支持 Ibatis,Spring 已将该类删除。在本地环境搜索 SqlMapClientFactoryBean 发现其存在,并位于 spring-orm 3.2.18.RELEASE 包中。按照正常推断,打包完成后部署包应该也是存在。于是登陆测试环境,打开依赖的 lib 中 查看,果然 spring-orm 依赖的非 3.2.18.RELEASE 版本,其为 4.3.12.RELEASE 版本。看来测试环境启动异常是因为依赖的不对的版本的 spring-orm 。

现在问题就变成了打包发布之后,其依赖的包版本就变了。查看项目的 pom 文件

pom
发现在 pom 中, 其 spring-orm 已经明确指定 3.2.18.RELEASE,那么发布版本的 4.3.12.RELEASE 版本的 jar 是哪里过来的那。仔细查看,发现其继承父 pom,父pom 指定的 orm 版本正好是 4.3.12.RELEASE。难道子 pom 指定版本并不会覆盖父 pom?但是仔细思考,maven 不可能这么设计。实在没辙,再次运行打包命令,发现其还是 4.3.12.RELEASE。查看 pom,发现其使用了 maven-assembly 插件,将相关依赖包打入一个统一的 lib 中。那会不是于是 assembly bug?尝将 maven-assembly 换成最新版本,再次打包,期待的 spring-orm 3.2.18.RELEASE 正确进入到 lib 中。再次发布测试环境,正常的启动完成。

参考链接:

  1. maven-assembly 2.2 修复的问题
  2. maven assembly pulls wrong dependency