BOM 减少版本冲突

    但随着项目的不断发展,一个微服务的依赖可能会越来越多,出现版本冲突的问题。

    举个版本冲突的例子:项目依赖的A的0.9版本,同时依赖了项目B,项目B又依赖了项目A的1.0版本。此时,项目会选择A的0.9还是1.0版本呢?

    事实上,按照Maven的依赖规则,会选用最小的版本0.9。如果0.9和1.0是API兼容的,那么问题不大。如果1.0的API发生了”break change”,那么很遗憾,项目B中的代码会包错,更离谱的是,只有运行时才会发生问题。这类问题经常难以诊断,因此,我们应当尽量减少版本冲突的问题。

    在本书的微服务架构下,我们强烈建议定义公共库的BOM,以减少版本冲突的问题。

    应用BOM需要两个步骤:

    1. 新建一个BOM的Maven项目
    2. 在项目中引用该BOM项目

    新建一个BOM项目非常简单,只需要一个xml文件

    1. 这是一个pom,应用了若干包,并指定了他们的版本
    2. 底部指定了maven仓库的发布地址(如果你有多个不同的maven repo权限才需要设定)

    然后看一下在gradle项目中如何引用bom:

    build.gradle:

    1. id "io.spring.dependency-management" version "1.0.3.RELEASE"
    2. }
    3. apply plugin: 'java'
    4. apply plugin: 'application'
    5. maven {
    6. credentials {
    7. password "$mavenPass"
    8. }
    9. url 'http://maven.coder4.com/nexus/content/groups/public'
    10. }
    11. }
    12. // import bom
    13. dependencyManagement {
    14. imports {
    15. }
    16. dependencies {
    17. // use bom version
    18. compile 'org.springframework.boot:spring-boot-starter-web'
    19. compile 'com.coder4.lmsia:redis'
    20. // Use JUnit test framework
    21. testCompile 'junit:junit:4.12'
    22. }

    如上所示,我们通过dependencyManagement插件引入了bom项目,而指定项目时只有group和project、没有版本,版本会自动使用bom中统一定义的。