1.Maven简介
1.1为什么要使用Maven?
传统方式构建的web项目中使用jar包,需要重复的复制到项目的lib中。
maven方法构建的web项目中没有jar包
1.2.Maven是什么?
maven是Apache公司的开源项目,是一个项目构建工具,用来管理依赖。
maven有两大核心功能:
- 管理依赖:对jar包统一管理
- 项目构建:项目在编码完成后,对项目进行编译、测试、打包、部署的一系列操作
1.3.Maven的好处如何实现?
1.3.1.仓库
- 本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包
- 私服:如果本地需要插件或者 jar 包,本地仓库没有则去私服下载
- 中央仓库 :中央仓库服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包 含了世界上大部分流行的开源项目构件。
1.3.2.坐标
什么是坐标?
作用:用于定位jar包在仓库中的位置
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
安装步骤:
-
配置MAVEN_HOME
-
将MAVEN_HOME环境变量配置到path中
-
测试
找开 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
4.创建maven工程
4.1.创建工程
4.2.1.创建工程
- 选择maven
-
设置工程名
-
设置工程位置
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 { @Test public void test(){ System.out.println("hello,maven!"); } }
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
- 说明:部署到远程仓库
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.版本锁定
版本锁定:使用dependencyManagement 进行版本锁定
<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指令范围之内)
6.3.2.测试
-
把spring-context的作用域换成test
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.8.RELEASE</version> <scope>test</scope> </dependency>
-
在main方法中测试
public class Demo { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("");//报错 } }
-
在junit中测试
public class DemoTest {
@Test
public void test2(){
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("");//不报错
}
}