Spring boot Spring Boot降级postgres版本

Spring boot Spring Boot降级postgres版本,spring-boot,Spring Boot,我有一个Spring Boot 1.5.14应用程序,它还引入了我们构建的自定义库,该库也依赖于Spring Boot。这个库(也是Spring Boot 1.5.14)有一些数据库实用程序,在它的构建中,gradle有: 编译“org.postgresql:postgresql:42.2.2” 但是,当我将该库添加到我的应用程序编译依赖项时,所使用的postgres驱动程序的实际版本(如在应用程序中运行`./gradlew依赖项所示): org.postgresql:postgresql:42

我有一个Spring Boot 1.5.14应用程序,它还引入了我们构建的自定义库,该库也依赖于Spring Boot。这个库(也是Spring Boot 1.5.14)有一些数据库实用程序,在它的构建中,gradle有:

编译“org.postgresql:postgresql:42.2.2”

但是,当我将该库添加到我的应用程序编译依赖项时,所使用的postgres驱动程序的实际版本(如在应用程序中运行`./gradlew依赖项所示):

org.postgresql:postgresql:42.2.2->9.4.1212.jre7

当应用程序无法实际打开到AppEngine上我试图连接的postgres实例的jdbc连接时,这最终导致了大量调试问题。这听起来和中描述的问题一样,因为postgres版本是中定义的


现在,我通过将
编译'org.postgresql:postgresql:42.2.2'
直接添加到我的应用程序的
build.gradle
文件中来解决这个问题。。。但我想更好地理解为什么Spring Boot只是在作为我的库的依赖项拉入时才降级了该版本。

您观察到的行为是由于Spring Boot的Gradle插件用于依赖项管理。使用版本在
build.gradle
中声明依赖项时,忽略配置的依赖项管理可能指定的任何版本

您还可以通过声明依赖项并将其配置为所需版本来覆盖依赖项管理。例如:

dependencies {
    compile 'com.google.guava:guava:18.0'
}
这将导致编译配置中
com.google.guava:guava:18.0
上的任何依赖项(直接或可传递)使用版本18.0,覆盖可能存在的任何依赖项管理

通过在其Postgres驱动程序依赖项上指定版本,您的库将覆盖Boot的依赖项管理

当您在另一个项目中使用库时,没有这种依赖关系,因此SpringBoot的依赖关系管理正在接管。当您在驱动程序上添加依赖项时(而不是依赖于它的传递性),您将再次覆盖依赖项管理

另一种方法是重写
postgres.version
属性:

ext['postgres.version'] = '42.2.2'

因此,对于任何可传递的依赖项,如果在Spring Boot BOM中有它的条目,依赖项管理插件将强制它到该版本?此外,该版本属性覆盖是否可以从库中指定,还是必须从应用程序中执行?是的,它将覆盖任何可传递依赖项的版本,以及任何未指定版本的直接依赖项的版本。需要在应用程序中重写version属性。