依赖管理与依赖冲突

开发交流
收藏
1 958
Sunny912
FoC 未认证 2019-03-04 10:58:00
付费话题:0 积分

什么是依赖管理

所谓依赖管理,其实就是指工程中依赖的第三方Jar包的管理。所谓管理也就是要解决:

1.     从哪里来

2.     用什么版本

3.     哪些任务依赖

4.     放在哪里

现代化的构建工具实际能够很好的解决依赖管理,只需要在构建脚本中配置好上述问题即可。

 

Cybertron是如何管理的

从哪儿来和用什么版本

依然使用了传统的方式,将所有依赖的特定版本的第三方jar包都直接保存在工程中,并通过配置管理统一维护。

 

为什么不使用maven库等网络库来维护

* 个人的网络配置情况不同

* GFW的存在

* CDKPDK开发模式的存在

      * 有些定制项目的开发可能在无外网访问的环境开发

哪些任务依赖

一般地,依赖会被分为(主要的):

l  编译依赖

    ?  已具备编译依赖(providedCompile)

l  测试依赖

l  运行时依赖

 

简单讲,编译依赖都会是运行时依赖,但运行时依赖并不一定是编译依赖。想想数据库的jdbc驱动包。

应该说,绝大多数的依赖都会是第一种情况。

放在哪里

有一个原则,就近依赖原则。鉴于Cybertron的工程结构是个多项目工程,因此工程中各个子工程都有各自依赖的jar包,那么这些jar包应该保存在各自的工程目录内。

 

maven等的存放方式有所不同,会统一存放在用户目录下。

Pros & Cons

* 一次下载多次使用

* 不够直观,想找jar文件的时候不知道从哪儿找

* 会有缓存问题

什么是依赖冲突

不同工程中的依赖jar包,虽然在开发阶段被保存在子工程各自的目录内,互不影响,但最终都会发布到统一的位置,被web应用所使用。

不同的子工程,可能有类似的功能(比如xml的读写),而由于各个子工程是由不同的开发人员所维护,因此就可能引入相同的的第三方jar包,但是由于引入时间不尽相同,就会导致可能引入不同版本的相同jar包,这时就产生了依赖冲突。

 

还有一种情况也会导致依赖冲突。就是依赖的第三方jar包自己也有依赖,而不同的第三方jar包的依赖也可能存在版本的差异。这种情况就更复杂。

如何解决依赖冲突

1.     首先应该考虑统一第三方jar包的版本,对于我们自己开发的代码所产生的依赖应该是能够解决的

1.1. 如果能够统一,那么应该将统一后的jar包放入cybertron-primus工程,避免多处存放

2.     合并依赖包(shadow),并进行relocate,即包名重命名

具体参见手册《15.1 依赖冲突》

 

 

 

回帖