Spring Boot 降级 postgres 版本
Posted
技术标签:
【中文标题】Spring Boot 降级 postgres 版本【英文标题】:Spring Boot downgrading postgres version 【发布时间】:2018-07-18 15:05:56 【问题描述】:我有一个 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 仅在作为我的依赖项引入时才降级该版本图书馆。
【问题讨论】:
【参考方案1】:您观察到的行为是由于 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'
【讨论】:
那么对于任何传递依赖,如果 Spring Boot BOM 中有它的条目,依赖管理插件会强制它到那个版本吗?另外,是否可以从库中指定版本属性覆盖,还是必须从应用程序中完成? 是的,它将覆盖任何传递依赖项的版本以及任何未指定版本的直接依赖项的版本。版本属性需要在应用中被覆盖。以上是关于Spring Boot 降级 postgres 版本的主要内容,如果未能解决你的问题,请参考以下文章
为啥 spring-boot 和 postgres 连接会在一段时间后断开?
在带有 Spring-boot 的 postgres 中使用整数数组