1、依赖有哪些配置?
- 示例:
<dependency>
<groupId>com.icegreen</groupId>
<!-- GreenMail是开源的邮件服务测试套件 -->
<artifactId>greenmail</artifactId>
<version>1.3.1b</version>
<type>jar</type>
<scope>test</scope>
<optional>
true</optional>
<exclusions>
<exclusion></exclusion>
</exclusions>
</dependency>
- 配置元素解释
groupId、artifactId、version:依赖的基本坐标,每个都有。
type:依赖的类型,对应于项目坐标定义packaging,大部分情况下该元素不必声明,其默认值jar
scope:依赖的范围
optional:标记依赖是否可选,可选依赖
exclusions:用来排除传递性依赖
2、依赖范围的解释?
不同的运行周期需要不同的jar包,依赖不同的文件,为了更有效的使用构建。
依赖范围用来控制依赖与这三种classpath(编译classpath,测试classpath,运行classpath)的关系。
Maven有以下几种依赖范围:
- compile:编译依赖范围,默认值。
- test: 测试依赖范围。
- provided: 已提供依赖范围。使使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子就是servlet-api,编译和测试的时候需要,但在运行项目的时候不需要,由于容器已经提供,就不需要冲入的引入了。
- runtime:运行时依赖范围。对于测试和运行classpath有效,但在编译主代码时无效。如JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在测试和运行的时候才需要实现JDBC接口的具体实现。
- system:系统依赖范围。同provided一样,不常用
- import:导入依赖范围。不会对三种classpath有影响,不常用
3、传递性依赖?什么意思,有哪些特性
A构建(jar)依赖B【第一依赖】,B依赖C【第二依赖】。如果都是默认的compile依赖范围,那么C就是A的一个传递性依赖。
传递性依赖Maven是会自动引入到项目中的。
对比其规律
4、依赖调解,调解肯定是传递性依赖产生冲突了,Maven有哪些原则来解决这些问题。
- 路径最近者优先(依赖层数最少者优先)
- 最先声明者优先(传递性依赖中,路径/层数一样,同一个版本最先声明者优先)
5、可选依赖,可选存在于多个特性仅能保存其一的情况,一般情况下不建议这样使用。
项目排除的,例如数据库驱动
<optional>
true</optional>
6、Maven依赖技巧:
排除依赖:exclusions
可以包括多个<exclusion></exclusion>
排除的时候,exclusion仅需要groupId和artifactId,不需要version
归类依赖:同一版本,定义一个变量
定义一些全局变量,用<properties></properties>,示例:
<
properties>
<
project.build.sourceEncoding>UTF-8</
project.build.sourceEncoding>
</
properties>
引入全局变量
<dependency>
<encoding>
${project.build.sourceEncoding}</encoding>
</dependency>
优化依赖:同优化代码一样,去除多余的依赖,显式的声明某些必要的依赖,工具分析的使用命令。
mvn dependency:list --查看当前项目已解析依赖
mvn dependency:tree --查看已解析的依赖树
mvn dependency:analyze --分析依赖前缀的问题,如下指出 了项目未使用,但是显式声明的依赖