我们再来讲讲maven有哪些特性,之后就可以点上maven这个知识点了。
- 依赖范围
首先,针对一个依赖的使用范围<scope>,maven为我们提供了3个可用阶段:编译,测试,运行。
先来看看官网上怎么说
Introduction to the Dependency Mechanismmaven.apache.org
不指定scope时,maven默认使用compile——编译测试运行都有效,即把jar包导入到编译、测试、运行全部3个classpath中,那么我们在任何阶段都能使用这个jar包。
比如我们常用的junit做单测时,就可以指定scope为test,即仅在测试时jar包才生效,其他阶段调用junit就会报错。
- 传递性
小学老师就教会了我们传递性这个概念,如果a依赖b,b依赖c,那么a引入b的jar包时,就会顺带把c包也加载进来。当然我们可以使用<exclusions>标签把不需要的jar包干掉。
- 聚合
我们写一个项目通常都会有很多模块,诸如orm、model、domain、service等等,要统一组织管理这些模块,就可以抽出一个父模块,在父模块中的pom使用<modules>标签将子模块聚合。
- 继承
继承对应聚合,即在子模块pom中使用<parent>标签声明其父模块,声明后就能引入父模块中定义的属性和依赖了。
- 冲突
日常编码中我们经常会遇到jar包冲突问题,它是由于多个依赖都引入了同一个构件导致的,这个冲突的构件名字相同,但版本可能不同。maven针对这种情况有两个默认的处理原则:
1.短路优先
举个例子,a依赖b、c,而b也依赖了c,由于传递性,c会被a引入两次,此时就会出现冲突。
那么对于c,a实际只需要引入一次就够了,然后a->c比a->b,b->c的路径短,根据短路优先原则就会走a->c这条依赖路径。
2.顺序优先
当依赖路径长度相同时,则看谁先声明,谁先喊了我要引入xx包,就会优先使用它的依赖路径。