1.maven坐标依赖
1.1 坐标
<groupId>com.sdc</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging>
① groupId: 定义当前Maven项目隶属的实际项目。
② artifactId:该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。
③ version :该元素定义Maven项目当前所处的版本。
④ packaging:该元素定义Maven项目的打包方式(默认jar[war,pom,maven-plugin,ear])。
⑤ classifier:该元素用来帮助定义构架输出的一些附属构件(次元素不能直接定义,因为生成的附属构件有支持的插件实现)。
1.2 依赖
<dependency> <groupId>...</groupId> <artifactId>..</artifactId> <version>...</version> <type>依赖的类型,对应于项目左边定义的packaging。(默认jar)</type> <scope>依赖的范围</scope> <optional>标记依赖是否可选</optional> <exclusions> <exclusion> 用来排除传递性依赖 </exclusion> ... </exclusions> </dependency>
1.2.1 依赖范围
依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,Maven有一下几种依赖范围:
① compile:编译依赖范围。默认依赖范围。对于编译、测试、运行三种classpath都有效。例子:spring-core 在三个范围内都需要使用该依赖。
② test:测试依赖范围。只对于测试classpath有效。典型的例子:jUnit。
③ provided:已提供依赖范围。对于编译和测试classpath有效,但在运行时无效。例子:servlet-api。
④ runtime:运行时依赖范围。对于测试和运行classpath有效,但在编译主代码时无效。例子:jdbc驱动实现。
⑤ system:系统依赖范围。与provided依赖范围一致。但使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。(可在成构建的不可移植,慎用)
⑥ import(Maven 2.0.9及以上):导入依赖范围。(继承)
1.2.2 依赖传递
Maven 依赖调解(Dependency Mediation)的第一原则是:路径最近者优先。
Maven定义了依赖调解的第二原则:第一声明者优先。
1.2.3 可选依赖
<optional>true</optional> :
对直接依赖当前项目(A)的项目(B)会产生影响。但对依赖项目(B)的项目(C)而言,项目(A)不会对项目(C)产生任何影响。
1.2.4 优化依赖
查看已解析依赖: mvn dependency:list
(已解析依赖:经过依赖处理后,确保任何一个构件只有唯一额版本在依赖中存在、)
查看依赖树:mvn dependency:tree
分析依赖关系: mvn dependency:analyze
(只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它就发现不了。例:spring-core和spring-beans是运行项目必要的类库,但分析时可能显示费必须依赖,但显然是不能直接删除spring依赖的)
学习资料: 《maven实战》
(图片来源网络!)