1.Maven简介
1.1.为什么要使用Maven?
传统方式构建的 web 项目:
特点:项目中使用jar包,需要重复的复制到项目的lib中
maven方式构建的 web 项目:
特点:maven项目中没有jar包
1.2.Maven是什么?
maven[ˈmevən]是Apache公司的开源项目,是一个项目构建工具和项目管理工具软件 ,用来管理依赖。
maven有两大核心功能:
1.管理依赖:对jar包统一管理
2.项目构建:项目在编码完成后,对项目进行编译、测试、打包、部署的一系列操作
1.3.Maven的好处如何实现?
1.3.1.仓库
-
本地仓库 :在程序员的电脑上,用于存储从中央仓库和私服下载的jar包
-
私服:在公司的一台电脑上,用于存储从中央仓库下载本地仓库没有的jar包。
-
中央仓库 :在外网,存放了基本上所有的jar包。中央仓库服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包 含了世界上大部分流行的开源项目构件。
1.3.2.坐标
作用:用于定位jar包在仓库中的位置
举例:mybatis-3.4.5.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.下载
官网:Maven – Welcome to Apache Maven
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!"); } }
4.4解决依赖下载失败的问题
1.删除文件重新下载
2.拷贝其他人的依赖
下载失败依赖:
下载成功依赖:
5.Maven生命周期
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中存在“三套”生命周期,每一套生命周期相互独立、互不影响,并且在一套生命周期内,执行后面的命令前面的命令都会自动执行:
-
清理生命周期:(相当于把运行编译文件夹target干掉)
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的Java目录)
测试程序(test的Java目录)
打包(war包)
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的Java目录中测试
public class Demo { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("");//报错 } }
-
在test的Java目录中测试
public class Demo { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("");//报错 } }