1.依赖配置
<project> ... <dependencies> <dependency> <groupId>xx</groupId> <artifactId>com.yy.xx</artifactId> <version>..</version> <type>..</type> <scope>...</scope> <option></option> <exclusions> <exclusion> .... </exclusion> </exclusions> </dependency> </dependencies> </project>
说明:
groupId,artifactId,version :依赖的基本坐标
type:依赖的类型,默认为jar
scope:依赖的范围
option: 标记依赖是否可选
exclusions:排除传递性依赖
2.依赖范围
<dependencies> <dependency> <groupId>xx</groupId> <artifactId>com.test.xx</artifactId> <scope>test</scope> </dependency> </dependencies>
1》comile:编译时依赖
2》test:测试时依赖
3》provided:已提供依赖范围,编译、测试生效,运行时不生效(例如servlet-api在tomcat中已经自带了,因此运行时不需要重复依赖)
4》runtime:运行时依赖,仅对测试、运行生效,编译不生效。
5》system:直接指定依赖的文件路径,和provided范围相同
<dependencies> <dependency> <groupId>xx</groupId> <artifactId>com.test.xx</artifactId> <scope>system</scope> <systempath>${java.home}/lib/xx.jar</systempath> </dependency> </dependencies>
6>import:导入依赖范围
3.传达性依赖(间接依赖)
A-->B-->C A依赖B,B又依赖C,那么A会通过B将C也会依赖过去。
传递依赖的范围取决于第一依赖的范围和第二依赖的范围(左边是第一依赖范围,上面是第二依赖范围,交叉部分为传递依赖范围)
4.依赖调解
1》A->B->E->C1.0, A->D->C2.0 : 此时A会依赖C1还是C2 ?
---依赖原则1:路径最近者优先
2》A->B->Y1.0, A->C->Y2.0 : 此时A会依赖Y1还是Y2 ?
---依赖原则2:第一声明优先
5.可选依赖
A->B, B->X(可选), B->Y(可选)
如果3者依赖范围都是compile,则X,Y都是A的compile的依赖范围,但是由于X/Y都是可选依赖,所以X,Y不会被传递
6.排除依赖
exlusions可通过*排除所有依赖,也可以排除一个,或者多个。
<dependencies> <!--排除所有传递依赖--> <dependency> <groupId>xx</groupId> <artifactId>com.yy.xx</artifactId> <version>..</version> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!--排除一个或者 多个传递依赖--> <dependency> <groupId>xx</groupId> <artifactId>com.yy.xx</artifactId> <version>..</version> <exclusions> <exclusion> <groupId>x1</groupId> <artifactId>com.xx.x1</artifactId> </exclusion> <exclusion> <groupId>xn</groupId> <artifactId>com.xx.xn</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
7.依赖优化
mvn dependency:list 查看依赖列表
mvn dependency:tree >a.txt 查看依赖树,生成a.txt
mvn dependency:analyze
依赖分析:展示结果有两部分
1>Used undeclared dependencies : 表示项目中使用到了,但是没有显示声明的依赖
2>Unused declared dependecies : 表示项目中未使用到,但是显示声明了的依赖,不能简单直接删除需要分析一下scope
dependency:analyze只能分析编译、和测试范围的依赖。