1,为什么使用Maven
1,依赖的jar包只在本地仓库保存一份,使用时输入‘坐标’即可,节省空间解决多个模块中重复导入。
2,导入一个jar,此jar包需要依赖其他jar包,maven能自动帮助导入。
3,解决jar直接的冲突, 依据:最短路径者优先和优先声明者优先。
4,在中央仓库下载规范的依赖。
2,依赖的范围
1,在<scope>标签内定义, 范围包括:
①compile, main目录下,test目录下部署到服务器上都依赖都起作用。默认。
②test 只要test目录下的java代码可以访问此依赖。
③provided main,test下面可以访问此依赖。但是不会部署到服务器上。
④runtime[了解] test目录下可以访问,也会部署到服务器上。
3, 依赖的传递性
1,只有compile依赖的范围下,依赖具有传递性。
4,依赖的排除
1,使用< exclusions>< exclusion> XXX< exclusion>< exclusions>可以在依赖某个工程时,不依赖此工程下的某个依赖。
5, 统一管理目标jar包的版本
1,<properties>
<spring.version>4.1.1.RELEASE</spring.version>
</properties>
6,在Maven多模块的时候,管理依赖关系是非常重要的,各种依赖包冲突,查询问题起来非常复杂,于是就用到了<dependencyManagement>
示例说明,
在父模块中:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
那么在子模块中只需要<groupId>和<artifactId>即可,如:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
说明:
使用dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,不用每个模块项目都弄一个版本号,不利于管理,当需要变更版本号的时候只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个特殊的版本号时,只需要在自己的模块dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。
与dependencies区别:
1)Dependencies相对于dependencyManagement,所有声明在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
2)dependencyManagement里只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
如果在父工程的<dependencyManagement>标签内写了某个依赖,但是没有明确定义此依赖的版本号,在子模块中导入此依赖时,maven会从<dependencyManagement>中找依赖版本号,此时找不到,会报错。所以在<dependencyManagement>书写的依赖必须有版本号,如果没版本号,就不要写,以免报错。