Spring Boot 降级 Postgres 版本

3
我有一个Spring Boot 1.5.14应用程序,它还引入了我们构建的自定义库,该库也依赖于Spring Boot。这个库(也是Spring Boot 1.5.14)具有某些数据库实用程序,在其build.gradle中有: compile 'org.postgresql:postgresql:42.2.2' 然而,当我将该库添加到我的应用程序编译依赖项中时,实际使用的postgres驱动程序版本(从运行“./gradlew dependencies”在应用程序中看到)为: org.postgresql:postgresql:42.2.2 -> 9.4.1212.jre7 这会导致很多调试烦恼,因为应用程序无法打开到我正在尝试连接的AppEngine上的postgres实例的jdbc连接。听起来像这个问题中描述的同样的问题,因为postgres版本是在Spring Boot dependencies BOM中定义的。 我最终通过直接将compile 'org.postgresql:postgresql:42.2.2'添加到我的应用程序的build.gradle文件中来解决此问题...但我希望更好地理解为什么当我的库依赖项被拉取时,Spring Boot只会降级该版本。
1个回答

4
你观察到的行为是由Spring Boot Gradle插件使用的Dependency Management Plugin导致的。当在build.gradle中声明依赖项及其版本时,它会尊重该版本并忽略配置的依赖管理可能指定的任何版本。

You can also override the dependency management by declaring a dependency and configuring it with the desired version. For example:

dependencies {
    compile 'com.google.guava:guava:18.0'
}

This will cause any dependency (direct or transitive) on com.google.guava:guava:18.0 in the compile configuration to use version 18.0, overriding any dependency management that may exist.

通过在其Postgres驱动程序依赖项上指定版本,您的库正在覆盖Boot的依赖关系管理。
当您在另一个项目中使用该库时,没有这样的依赖项,因此Spring Boot的依赖关系管理接管了。当您添加驱动程序的依赖项(而不是依赖于它以传递方式),您再次覆盖了依赖关系管理。
另一种方法是覆盖postgres.version属性:
ext['postgres.version'] = '42.2.2'

那么对于任何传递依赖项,如果在Spring Boot BOM中有其条目,则依赖管理插件将强制使用该版本?此外,该版本属性覆盖是否可以从库中指定,还是必须从应用程序中完成? - chinabuffet
1
是的,它将覆盖任何传递依赖项的版本,以及任何未指定版本的直接依赖项的版本。版本属性需要在应用程序中被覆盖。 - Andy Wilkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接