maven的仲裁

模块化的问题是无法避免的一个问题。对创业公司来说,在团队和产品在发展到一定程度之前,靠自我约束。

这里有一个案例是项目里依赖了b组件,b组件依赖了a组件1.0.2版本,而用户也直接在pom依赖了a组件并声明的1.0.0版本,结果在仲裁时选择了1.0.0版本的a组件:

 +- com.xxx:a:jar:1.0.0:compile
 |   
 +- ...
 |  +- ...
 |  
 +- com.xxx:b:jar:1.0.0:compile
 |  |  
 |  +- (com.xxx:a:jar:1.0.2:compile - omitted for duplicate)

对于依赖某个组件的多个版本,maven的仲裁过程,并不是简单的使用高版本,而是根据从根节点到各个组件节点之间的路径深度,路径短的组件优先,如果路径深度相同,则是先发现的那个。类似一棵树的广度遍历。

maven的仲裁》上有2条评论

  1. zc

    这点上我更喜欢gradle的处理方式,可以定制策略,可以选择一旦发现有版本冲突就报错,,或者是指定某个版本,maven的这种仲裁还是很容易出错

    回复
    1. 黄博文

      maven依赖配置中可以exclude掉指定的包。对于java项目构建来说我更喜欢gradle,实在不喜欢啰嗦式的xml配置。

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注