Maven依赖
Maven依赖
坐标详解:
groupId:定义当前Maven项目隶属的实际项目
artifactId:该元素定义十几项目中的一个Maven项目(模块)
version:钙元素定义Maven项目当前所属的版本
packaging:该元素定义Maven项目的打包方式,默认jar
classifier:该元素用来帮助定义构建输出的一些附属构建
上述5个元素,groupId、artifactId、version是必须定义的,packaging是可选的,classifier是不能直接定义的
项目构建的文件名是与坐标相对应的,一般规则为:artifactId-version[-classifier].pakaging
依赖范围:就是用来控制依赖与三种classpath(编译classpath、测试classpath、运行classpath)的关系
compile:编译依赖范围,默认依赖范围。对于编译、测试、运行三种classpath都有效
test:测试依赖范围,只对测试classpath有效
provided:以提供依赖范围,对编译、测试classpath有效
runtime:运行时依赖范围,对测试、运行classpath有效
system:系统依赖范围,对编译、测试classpath有效,使用系统范围的依赖必须通过systemPath元素显示制动以来文件的路径
传递性依赖:
假设某项目有一个compile范围的spring-core依赖,spring-core有一个compile范围的commons-logging依赖,那么commons-logging
就会成为该项目的compile依赖,Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的方式引入到项目中来。
传递性依赖范围:
假设A依赖于B,B依赖于C,那么A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。第一直接依赖的范围和第二
直接依赖的范围决定了传递性依赖的范围,第一列为第一直接依赖,第一行为第二直接依赖,传递性依赖范围如下表:
compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime
依赖调解:
假设项目A有这样的依赖:A--B--C--X(1.0)、A--D--X(2.0),X是A的传递性依赖,但是两个路径上有两个X版本,那么哪个X会被Maven解析使用呢?
Maven依赖调解第一原则:路径最短优先
假设项目A有这样的依赖:A--B--Y(1.0)、A--C--Y(2.0),路径一样长,那么那个Y会被Maven解析使用呢?
Maven依赖调解第二原则:第一声明者优先,即如果B的依赖声明在C前面,那么Y(1.0)就会被解析
可选依赖:
项目A依赖于项目B,项目B依赖于项目X和Y,B对于X和Y的依赖都是可选依赖,那么X、Y就是A的传递性依赖,假设范围都是compile,由于X、Y是可选依赖
那么依赖传递不会得以传递,X、Y将不会对A有任何影响,使用<optional>元素表示某个项目为可选依赖(<optional>true</optional>)
1 <dependencies> 2 <dependency> 3 <groupId>mysql</groupId> 4 <artifactId>mysql-connector-java</artifactId> 5 <version>5.1.10</version> 6 <optional>true</optional> 7 </dependency> 8 <dependency> 9 <groupId>postgresql</groupId> 10 <artifactId>postgresql</artifactId> 11 <version>8.4-701.jdbc3</version> 12 <optional>true</optional> 13 </dependency> 14 </dependencies>
可选依赖不会被传递。
排除依赖:
使用exclusions元素声明排除依赖,exclusions可以包含一个或多个exclusion子元素,因此可以排除一个或多个传递性依赖,exclusion元素只需要groupId
和artifactId,不需要version元素,因为只需要groupId和artifactId就可以唯一确定依赖图中的某个依赖,换句话说,Maven解析后的依赖,不可能出现
groupId和artifactId相同,但是version不同的两个依赖
1 <dependencies> 2 <dependency> 3 <groupId>com.juvenxu.mvnbook</groupId> 4 <artifactId>project-b</artifactId> 5 <version>1.0.0</version> 6 <exclusions> 7 <exclusion> 8 <groupId>com.juvenxu.mvnbook</groupId> 9 <artifactId>project-c</artifactId> 10 </exclusion> 11 </exclusions> 12 </dependency> 13 </dependencies>
归类依赖:
使用properties元素定义Maven属性,例如<properties><springframework.version>2.5.6</springframework.version></properties>,之后可以在version元素
中将版本号为2.5.6的依赖用${springframework.version}代替,之后升级时,可直接修改properties属性即可
1 <properties> 2 <springframework.version>2.5.6</springframework.version> 3 </properties> 4 5 <dependencies> 6 <dependency> 7 <groupId>org.springframework</groupId> 8 <artifactId>spring-core</artifactId> 9 <version>${springframework.version}</version> 10 </dependency> 11 <dependency> 12 <groupId>org.springframework</groupId> 13 <artifactId>spring-beans</artifactId> 14 <version>${springframework.version}</version> 15 </dependency> 16 <dependency> 17 <groupId>org.springframework</groupId> 18 <artifactId>spring-context</artifactId> 19 <version>${springframework.version}</version> 20 </dependency> 21 <dependency> 22 <groupId>org.springframework</groupId> 23 <artifactId>spring-context-support</artifactId> 24 <version>${springframework.version}</version> 25 </dependency> 26 </dependencies>
优化依赖:
mvn dependency:list 该命令可以查看当前项目的已解析依赖

mvn dependency:tree 该命令可以查看当前项目的依赖树

mvn dependency:analyze 该命令可以分析项目当前的依赖情况,其中Used undeclared dependencies表示项目中使用到的,但没有显示声明的依赖,这种依赖意味着潜在的风险,因此,显示声明任何项目中直接使用到的依赖。
Unused declared dependencies表示项目中没有使用到但显示声明的依赖,对于这样的依赖我们不应该简单的直接删除,因为analyze命令只会分析编译、测试代码需要用到的依赖,运行时需要的依赖就发现不了

浙公网安备 33010602011771号