我有一个Spring Boot 1.5.14应用程序,该应用程序还引入了我们构建的自定义库,该库也依赖于Spring Boot。这个库(也是Spring Boot 1.5.14)具有一些数据库实用程序,并且在其build.gradle中具有:
compile 'org.postgresql:postgresql:42.2.2'
但是,当我将该库添加到我的应用程序中时,它会编译所使用的postgres驱动程序的实际版本(从在应用程序中运行`./gradlew依赖项可以看出):
org.postgresql:postgresql:42.2.2 -> 9.4.1212.jre7
当应用程序实际上无法打开与我尝试连接的AppEngine上的postgres实例的jdbc连接时,这会导致很多调试麻烦。听起来像this issue中描述的相同问题,因为该postgres版本是Spring Boot dependencies BOM中定义的版本。
我现在通过将compile 'org.postgresql:postgresql:42.2.2'
直接添加到应用程序的build.gradle
文件中来解决此问题,但是我想更好地理解为什么Spring Boot仅当以我图书馆的依赖性。
答案 0 :(得分:3)
您观察到的行为归因于Spring Boot的Gradle插件用于依赖性管理的Dependency Management Plugin。在build.gradle
中声明某个版本的依赖项时,it honours that version会忽略已配置的依赖项管理可能指定的任何版本。
您还可以通过声明依赖项并将其配置为所需的版本来覆盖依赖项管理。例如:
dependencies { compile 'com.google.guava:guava:18.0' }
这将导致编译配置中对
com.google.guava:guava:18.0
的任何依赖(直接或传递)都使用18.0版,从而覆盖可能存在的任何依赖管理。
通过在Postgres驱动程序依赖项上指定版本,您的库将覆盖Boot的依赖项管理。
当您在另一个项目中使用该库时,没有这种依赖关系,因此Spring Boot的依赖关系管理将接管。当您在驱动程序上添加依赖项时(而不是依赖于传递性),您将再次重写依赖项管理。
另一种方法是覆盖postgres.version
属性:
ext['postgres.version'] = '42.2.2'