最近从gitee上下载了一个多模块项目,然后本地有多个不同数据库的数据源,选用dynamic-datasource来切换数据源,但是在导入dynamic-datasource的jar包时出现了问题,在pom.xml文件中添加了jar包,但是项目中并没有找到对应jar包,引用也没有报错变红,检查了下,maven本地仓库也能正常找到对应jar包,百度了下,并没有找到相关错误例子。
于是只能把jar包放在项目目录下,然后手动添加进项目,添加到主模块上,但启动仍然报错,想了各种办法无果。
然后我重新另外新建一个maven项目,导入dynamic-datasource的jar包却没有任何问题,按照dynamic-datasource文档配置多数据源,创建多个对象,也能正常切换数据源查询数据。
于是我在新项目的pom.xml文件中手动挨个添加差异项,当添加到<dependencyManagement>这个标签时,新项目开始报错,jar包也全找不到了,百度了下<dependencyManagement>和<dependencies>的区别,终于找到原因:
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
所以maven库中有jar包,但是引入不到,也不报错变红的原因找到了,虽然我在父项目添加了dynamic-datasource的jar包,但添加在<dependencyManagement>里面只是声明依赖,子项并没有声明依赖dynamic-datasource,所以子项无法引用到dynamic-datasource的具体方法导致报错,就算后面我手动把dynamic-datasource的实体jar包手动添加到父项目,但需要切换数据源方法的是子项,子项不声明也是没法引用;所以,在父项目的<dependencyManagement>里声明dynamic-datasource,在实际调用数据源的子项声明dynamic-datasource依赖,系统就能正常调用dynamic-datasource了。
唉,所以出现这一堆的问题,还是因为对maven的相关基础配置不够熟悉导致的,打好基础,才能减少类似问题发生。不积跬步无以至千里。