1.Maven简介
1.1 为什么要使用Maven?
传统方式构建的web项目
特点:项目中使用jar包,需要重复的复制到项目的lib中
maven方式创建的web项目
相比之下占用空间要小得多
1.2 maven是什么?
maven[ˈmevən]是Apache公司的开源项目,是一个项目构建工具,用来管理依赖。
maven有两大核心功能:
1.管理依赖:对jar包统一管理。
2.项目构建:项目再编码完成后,对项目进行编译、测试、打包、部署、等操作。
1.3.Maven的好处如何实现?
1.3.1.仓库
本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包
私服:如果本地需要插件或者 jar 包,本地仓库没有则去私服下载
中央仓库 :中央仓库服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包 含了世界上大部分流行的开源项目构件。
1.3.2坐标
作用:用于定位jar包在仓库中的位置
坐标:org.mybatis(公司) + mybatis(项目) + 3.4.5(版本信息)
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> |
2. Maven安装
2.1 下载
官网:http://maven.apache.org/
2.2解压
Maven 下载后将 Maven 解压到一个没有中文没有空格的路径下, 解压后目录结构如下:
bin:脚本命令
boot:引导程序,如类加载器等
conf:配置文件,如 setting.xml 文件
lib:maven 本身运行所需的一些 jar 包
2.3配置环境变量
安装前提:maven是由java语言开发,它的运行依赖于jdk
安装步骤:
1.配置MAVEN_HOME
2.将MAVEN_HOME环境变量配置到path中
3.测试
找开 cmd 命令,输入 mvn –version
命令,如下图
2.4.配置阿里云镜像仓库
直接从maven中央仓库下载速度非常慢,我们可以在settings配置文件中,配置阿里云镜像仓库:
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> |
2.5.配置本地仓库路径
打开 settings.xml文件,配置如下:
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> --> <localRepository>D:\mvn_repository</localRepository> |
路径是自定义的
3.Idea集成Maven
3.1.配置maven
打开:File | Settings | Build, Execution, Deployment | Build Tools | Maven
3.2.设置idea自动导入依赖
第一种方式:首次在pom文件中添加依赖时,IDEA右下角会弹框提示是否开启自动导入,点击开启即可。
第二种方式:File | Settings | Build, Execution, Deployment | Build Tools | Maven | Importing
注:idea新版本不需要导入,软件自动导入,可掠过这一步
4.创建maven工程
4.1.创建工程
1.选择maven
老版本idea:
2.设置工程名
3.设置工程位置
新版本idea:
4.2.maven工程目录结构
目录结构如下图:
说明:
|---src:源码 |--- |---main:存放主程序 |--- |--- |---java:java源码文件 |--- |--- |---resource:存放框架的配置文件 |--- |--- test:存放测试程序 |---pom.xml:maven的核心配置文件 |
4.3.添加依赖
-
查找坐标
在浏览器打开https://mvnrepository.com/,查找junit的坐标(直接搜索框搜索)
-
在pom文件添加依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
添加测试类
import org.junit.Test; public class DemoTest { |
5.生命周期
5.1.常用命令
在pom.xml的同级目录下面,执行cmd命令
5.1.1.clean
命令:mvn clean
说明:将项目根目录下target目录清理掉
5.1.2.compile
命令:mvn compile
说明:将项目中的.java文件编译为.class文件
5.1.3 test
命令:mvn test
说明:将项目根目录下target目录清理掉
5.1.4.package
命令:mvn package
说明:将项目打包到target目录下
5.1.5.install
命令:mvn install
说明:打包到本地仓库
5.1.6.deploy
命令:mvn deploy
说明:部署到远程仓库
注:这些命令在idea中又快捷方式,无须特意记忆
5.2.生命周期
在maven中存在“三套”生命周期,每一套生命周期相互独立、互不影响,并且在一套生命周期内,执行后面的命令前面的命令都会自动执行:
清理生命周期:
clean
默认生命周期:
compile—test—package—install—deploy
站点生命周期(生成网页,一般不用且需要插件):
site
6.依赖管理
6.1.依赖传递
直接依赖:在当前项目中,通过依赖配置建立的依赖关系
间接依赖:被依赖的资源,如果还依赖其他资源,那么当前项目间接依赖其他资源
6.2.依赖冲突
依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。
如下所示:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
通过查看依赖,我们发现spring-aop和spring-context都依赖了一个叫spring-core的依赖。此时spring-core的版本有两个,这样就产生了依赖冲突
6.2.1.第一声明者优先原则
谁先定义的就用谁的传递依赖:即调换spring-aop和spring-context位置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
效果:
6.2.2.路径近者优先原则
直接依赖级别高于传递依赖:即直接引入spring-beans
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
6.2.3.排除依赖
排除依赖:在不影响项目运行的情况下把冲突的依赖排除掉
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
*6.2.4.版本锁定(重点)
<properties>
<spring-core.version>5.2.0.RELEASE</spring-core.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-core.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
6.3.依赖范围
6.3.1.什么是依赖范围?
依赖的jar包在默认情况下可以在任何范围内使用,可以通过scope标签来控制其作用范围。作用范围如下:
主程序(main方法)
测试程序(junit)
打包(package指令范围之内)
例:把spring-context的作用域换成test
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
<scope>test</scope>
</dependency>