Mac下的Maven配置安装,可以查看另一篇博客:传送门
目录
一、简述
maven是一个项目管理工具。
maven拆分思想:
maven解决代码可重用和便于维护问题上的解决方案:
maven把一个完成的项目,分成不同的独立模块,这些模块都有各自独立的坐标。哪个地方需要其中某个模块,就直接引用该模块的坐标即可。实际开发中,先考虑的问题不是dao、service、utils、domain如何编写,我们要考虑的是dao、service、utils、domain是否已经存在,如果存在直接引用。
maven聚合思想:可以把拆分独立的各个模块聚合到一起编写成一个完成的项目。
依赖管理:maven对项目中jar包的管理过程。pom文件管理jar包坐标。
- 传统项目直接把jar包放置在项目中。
- maven工程真正的jar包放置在仓库中,项目中只需要放置jar包的坐标。-- 当项目编译或运行时,项目会自动通过jar包坐标在仓库中找到所对应的jar包。
二、仓库
2.1 仓库种类
- 本地仓库:只能通过安装的方式将jar包安装到本地仓库。拷贝到本地仓库的jar包是没有效果的。
- 远程仓库【也称之为私服】-- 放置了公司内部开发所需要的jar包。若公司没有网络时,本地仓库没有jar包,我们可以通过局域网从远程下载jar包。
- 中央仓库 – 安装了maven之后,自动就连着中央仓库,需要电脑连接着网络,才可以在中央仓库下载jar包。
2.2 仓库之间的关系
当我们启动一个maven工程的时候,maven工程通过pom文件中jar包的坐标去本地仓库找对应jar包。
默认情况下,如果本地仓库没有对应jar包,maven工程会自动去中央仓库下载jar包到本地仓库。
在公司中,如果本地没有对应jar包,会先从私服下载jar包。
如果私服也没有jar包,可以从中央仓库下载,也可以从本地上传。
三、常用命令
maven一键构建:maven自身集成了tomcat插件,可以对项目进行编译、测试、打包、安装、发布等操作。
maven常用命令:
- clean 清理项目以前的构建信息
- compile 对src/main/java 下的目录进行编译。
- test 编译测试代码
- package 把本地项目打包到了本地编译目录 target
- install 把包安装到本地仓库
- deploy 将本地做好的项目直接上传到私服
maven以上命令涉及了三套生命周期:
- 清理生命周期
- 默认生命周期
- 站点生命周期
四、解决jar包冲突
maven工程要导入jar包坐标,就必须要考虑解决jar包冲突,解决jar包冲突的方式有如下三种:
4.1 第一声明优先原则
第一声明优先原则:哪个jar包的坐标在pom靠上的位置,这个jar包就是先声明的。
先声明的jar包坐标下的依赖包,可以优先进入项目中。
比如:
A 导入方式
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
</dependencies>
B 导入方式:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
</dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
我们知道spring-beans的jar包依赖spring-core。此时spring-beans坐标位置会影响到spring-core的jar包的版本。
根据第一声明优先原则:
A导入jar包分别为:
spring-core版本5.0.2.RELEASE,spring-beans版本4.1.2.RELEASE
B导入jar包分别为:
spring-core版本4.1.2.RELEASE,spring-beans版本4.1.2.RELEASE
4.2 路径近者优先原则
首先,我们需要明确maven导入jar包中两个概念:
直接依赖:项目中直接导入的jar包,就是直接该项目的直接依赖包。
传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中。
路径近者优先原则:直接依赖路径比传递依赖路径近,那么最终项目进入的jar包是路径近的直接依赖包。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>
</dependencies>
此时,项目对spring-core是直接依赖。此时项目引入的jar包为:
spring-core版本4.2.8.RELEASE
4.3 直接排除法【推荐使用】
当我们要排除某个jar包下依赖,当配置exclusions标签的时候,内部可以不写版本号。
因为此时依赖包使用的版本号默认与本jar包一样。
该方式优于方式一、方式二。因为在多人开发时,此种方式可以避免其他人员移动jar包坐标带来的jar包版本问题。
<dependencies>
<dependency>
<groupId>org.springframework</groupId