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需要两个步骤:
- 新建一个BOM的Maven项目
- 在项目中引用该BOM项目
新建一个BOM项目非常简单,只需要一个xml文件
- 这是一个pom,应用了若干包,并指定了他们的版本
- 底部指定了maven仓库的发布地址(如果你有多个不同的maven repo权限才需要设定)
然后看一下在gradle项目中如何引用bom:
build.gradle:
id "io.spring.dependency-management" version "1.0.3.RELEASE"
}
apply plugin: 'java'
apply plugin: 'application'
maven {
credentials {
password "$mavenPass"
}
url 'http://maven.coder4.com/nexus/content/groups/public'
}
}
// import bom
dependencyManagement {
imports {
}
dependencies {
// use bom version
compile 'org.springframework.boot:spring-boot-starter-web'
compile 'com.coder4.lmsia:redis'
// Use JUnit test framework
testCompile 'junit:junit:4.12'
}
如上所示,我们通过dependencyManagement插件引入了bom项目,而指定项目时只有group和project、没有版本,版本会自动使用bom中统一定义的。