情况描述:一个项目下有两个工程,一个为Spring工程,一个是SpringBoot工程,两个项目引用相同的BaseDao,SpringBoot版本1.5.3.RELEASE,Spring版本4.3.18.RELEASE.SpringBoot本身集成hibernate,并且对应版本号为5.0.12.Final,Spring工程引入的版本号为5.0.11.Final。两者版本号不同,但是版本间差距较小,调用起来没发现啥问题。
由于Spring工程涉及到的并发比较多,5.0.11.Final版本oracle数据库加锁查询无效,升级到了5.6.5.Final版本解决了,但是也带来了新的问题。SpringBoot工程调用BaseDao时,报java.lang.NoSuchMethodError 找不到方法错误。
针对这一问题想过很多解决方法,比如说分两次编译(没有相关经验,网上也没有合适的方法,所以这个想法放弃了),还有<scope>provided</scope>配置,发现并没什么用。强行升级SpringBoot依赖的版本号,结果SpringBoot不支持报错。如果把SpringBoot版本升级至2.0.0.RELEASE版本,这个版本对应的hibernate为5.2.14.Final(这个版本hibernate解决了oracle数据库事务问题,5.2.1.Final版本解决的),对应的spring版本也要升到5.0.4.RELEASE版本,等等很多对应的组件需要相应的升级,并且升级带来的改动是非常巨大的,由于后面项目版本不需要在架构下进行迭代,如此大的改动是不可以接受的。
所以综合考虑,把BaseDao相关问题提出来,分成两个包,两个工程分开调用,经过测试验证该方法可以解决此问题。