本文记录了在项目迁移中遇到各种冲突,以及如何寻找问题原因,以及快速解决方案,其中包含多数据源相关问题,依赖冲突,版本冲突等问题
迁移的是gitub上开源项目,使用的是多数据源,迁移到公司自己项目架构上,发生了种种问题,
下面是问题产生和种种修改过程,希望对大家做迁移或者项目架构时有一定的帮助。
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine suitable jdbc url
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (the profiles dev are currently active).
首先这是一个常见的数据源未找到的,自动加载配置没有成功。理论上来说我们用多数据源配置,应该使用多数源包下面的自动加载配置类
上面是报错的一些信息,可以看到是DataSourcePoolMetricsAutoConfiguration 这个自动配置没有成功,这是我们先看一下这个是属于哪个包下面的。
可以idea定位一下,然后接下来最好的就是看这个依赖是否是绝对需要的,如果不需要,则在项目中找到依赖关系,把他排除。或者还有使用springboot的排除自动配置注解。可能我们在项目中遇到的是不同的类但大致都是用这两种方法。
再次启动
依然还是报错,不过这次可以看到他报错的配置类已经不同DruidDataSourceAutoConfigure,是说明有效果的继续用上述方法,排除依赖或者排除启动类。
继续
这次是FlywayAutoConfiguration
这时候排除的已经非常多了,其实有时候还是建议的是优化依赖关系。
上面这是原项目的数据库相关依赖
这是现项目的依赖,可以看到是非常多而且杂的很容易冲突,熟悉自己项目的依赖关系进行优化
多数据源用一个依赖就可以了
尽量把别的相关依赖都排除
使用exclusions标签。。甚至可以先把所有数据库相关依赖都排除至相关类找不到,再单个添加依赖。
数据库连接成功
但似乎又有新的问题
如果你对自己框架熟悉那么很容易看出其中的问题,而我自己比较熟悉这套框架,hztechRedis 是公司框架封装的redis使用包,很明显这是跟原项目(需要迁移过来的项目)中封装的redis包冲突了,这是你可以替换他的使用,但这是很麻烦的事情需要修改源码。最方便的当然是直接排除
解决,继续向下(别看这是直接打开那个注掉的就行,因为是复盘所以直接去掉注释)
新的问题
新的问题缺少类,很明显FilterChainProxy,在现有项目搜一下确实没有。
原项目中去找,原项目中必然能找到并且确定是那个包下面的。
再看现有项目有无这个依赖,一般都是缺少依赖,从原项目找到依赖关系,发现是boot-starter-security 下的,直接把依赖加过去。
继续启动。新的问题
同样的问题,ClassDefFoundError 去原项目找,这时候你会发现原项目也找不到这个东西
在这种情况下是必须看源码的
可以看到是redis塞数据是使用json序列化出错了,如果同样的代码在一个项目能运行,在另一个项目无法运行那么毋庸置疑是环境问题,依赖冲突
json使用的都是alibaba的包,对比依赖
原项目:
现项目:
仔细一点就能看出项目有一个fastjson 2.0.43 很明显的依赖冲突,寻找依赖关系,进行排除
新的问题
这个也能看出是应项目所使用的日志系统没有导致找不到org.apache.log4j.Logger,导入原项目日志依赖即可
至此项目整体迁移至新架构成功,当然这只是粗略的迁移到能成功运行,要融入到一个新的架构中还需要做很多内部修改。
总结:作为开发者要对项目的异常有一种直觉哪些是依赖冲突,哪些是缺少依赖,哪些是版本冲突,如何进行快速定位,以及解决问题。希望此文对大家有一定的帮助。