上篇说到传递依赖,其优点我们有目共睹,其为我们提高了很多效率,减少了很多工作量。但现实是把双刃剑,完美中总会有所不足。Maven的传递依赖给我们带来的点点不足便是:我们本需要依赖的一些jar包,可能通过传递依赖的形式依赖了,程序固然不会报错。但从长远看,我们交接项目后,新人会对我们的依赖不清不楚。
所以Maven提倡将必要的依赖显式声明,让开发者对Maven项目的依赖了然于胸,并可对其进行优化。如:去除多余的依赖,显式声明必要的依赖。
本篇,主要带大家了解两个mvn命令,这两个命令都可以帮我们分析项目实际依赖情况,以ITOO项目为例:
mvn dependency:tree
通过该命令,我们可以得到项目的依赖树:
这棵树,体现的是:直接在当前项目POM声明的依赖为顶层依赖,如itoo-basic-api。而这些顶层依赖的依赖则定义为二层依赖,如:itoo-base,以此类推......
本模块本该依赖itoo-base,但POM中我并没有依赖itoo-base,编译运行却没有报错,这就是因为我依赖了itoo-basic-api,而itoo-basic-api依赖了itoo-base。所以我的模块传递依赖了itoo-base。
POM文件:
对于我们需要声明但已经传递依赖过来,或者我们不需要却声明的依赖。有一个更方便的命令帮我们进行分析:
mvn dependency:analyze
其中:Used undeclared dependencies found(用到却没有显示声明),提示我们项目用到了itoo-base,却没有显式声明,则此时我们最好将其显式声明,使POM清晰明了,并且可控。
Unused declared dependencies found(没有用到却声明了),提示我们这些jar包没有用到,但我们声明了。这样的需要注意,我们不能简单地直接删掉其声明,而应该仔细分析。由于dependency:analyze只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它无法发现。很显然,itoo-easyui是我们UI必须要用到的,因此不应该删除依赖声明。所以,此命令可以帮助我们分析找到一些无用的依赖,但也需要我们去分析。
总结,Maven优化依赖不可小觑,我们项目就由于前期对此不重视,导致项目jar包冗余,服务器内存经常不足或宕机,经优化后,本模块从34M,瘦身至6M,效果显著。