Maven定义
Maven 是Apache 的一个开源项目,是Java开发环境中用于管理和构建项目,以及维护依赖关系的强大软件项目管理工具。
Maven作用
1.依赖管理
Maven 一个核心的特性就是依赖管理,依赖管理是项目管理中非常重要的一环。
当我们处理多模块的项目,比如:包含成百上千个模块或者子项目,随着这个依赖的树的延伸和扩大,模块间的依赖关系就变得非常复杂,管理也变得很困难。
针对此种情形,Maven提供了一套完整的方法,让使用者可以轻松的管理项目的依赖。
2.一键构建
指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理,这个 过程称为构建,使用 maven 一个命令可以轻松完成整个工作。
Maven优缺点
1.优点
- 简化了项目依赖管理;
- 易于上手,对于新手来说了解几个常用命令即可满足日常工作;
- 便于与持续集成工具(jenkins)整合;
- 便于项目升级,无论是项目本身还是项目使用的依赖;
- maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等。
2.缺点
- maven是一个庞大的构建系统,学习难度大;
- maven采用约定优于配置的策略,虽然上手容易,但是一旦出了问题,难于调试。
Maven下载安装
1.进入Maven官网下载
地址:https://maven.apache.org/index.html
2.下载具体的版本
点击上图的Download下载具体的版本,如下图所示:
Binary开头的版本:指的是不需要编译成可执行文件。
Source开头的版本:指的是需要编译成可执行文件。
tar.gz后缀结尾:是Linux的安装包,.zip后缀结尾是windows版本。
比如:选择apache-maven-3.8.6-bin.zip这个就可以,下载完成后解压一下,如下图所示:
主要包含4个重要的目录:
bin: 该目录包含了 mvn 运行的脚本,这些脚本用来配置 java 命令;
boot:该目录只包含一个文件,该文件是一个类加载器框架,Maven 使用该框架加载自己的类库;
conf:该目录包含了一个非常重要的文件 settings.xml,用于全局定义 Maven 的行为;
Lib:该目录包含了所有 Maven 运行时需要的 Java 类库;
Maven环境配置
1.打开系统设置
首先右击此电脑,属性,打开高级系统设置。
2.点击环境变量
3.新建系统变量
在系统变量这一栏,选择新建,如下图所示:
增加MAVEN_HOME,后面是你解压的Maven目录,如下图所示:
之后找系统变量中的Path,点击编辑,如下图所示:
输入%MAVEN_HOME%\bin,再点击确定,如下图所示:
命令提示符中使用mvn -version来判断是否配置完成。
如果出现上图的Maven版本号,就说明你Maven安装配置成功了。
Maven运行原理
Maven的实现模型如下图所示:
主要包含如下4大组件:
- 一个项目对象模 型 (POM:Project Object Model);
- 一组标准集合,一个项目生命周期(Project Lifecycle);
- 一个依赖管 理系统(Dependency Management System);
- 用来运行定义在生命周期阶段(phase)中插件(plugin)等;
1.对象模型POM
POM:Project Object Model,表示一个项目对象模 型,如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mikechen.maven</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> .... <build/> </project>
1)modelVersion
指定了当前Maven模型的版本号,比如:4.0.0。
2)groupId
顾名思义,这个应该是公司名或是组织名,一般来说groupId是由三个部分组成:
第一部分是项目用途,比如用于商业的就是”com”;
第二部分是公司名,比如”taobao”、”alibaba”、”mikechen”;
第三部分是你的项目名,比如:”mall”等。
3)artifactId
可以认为是Maven构建的项目名,比如你的项目中有子项目,就可以使用”项目名-子项目名”的命名方式。
4)version
即版本号,这里补充说下:SNAPSHOT意为快照,说明该项目还在开发中,是不稳定的版本,一般正式版本会取消掉SNAPSHOT。
总之,groupId、artifactId、version三个元素生成了一个Maven项目的基本坐标,这非常重要。
2.依赖管理系统
通过 Maven 的依赖管理对项目所依赖的 jar 包进行统一管理,这就是依赖管理。
比如,项目依赖 junit4.9,通过在 pom.xml 中定义如下所示:
<!-- 依赖关系 --> <dependencies> <!-- 此项目运行使用 junit,所以此项目依赖 junit --> <dependency> <!-- junit 的项目名称 --> <groupId>junit</groupId> <!-- junit 的模块名称 --> <artifactId>junit</artifactId> <!-- junit 版本 --> <version>4.9</version> <!-- 依赖范围:单元测试时使用 junit --> <scope>test</scope> </dependency>
依赖关系都会放在dependencies里面,有新的依赖只需要增加一组dependency即可。
Maven常见的依赖范围有哪些?
maven的依赖范围包括: compile,provide,runtime,test,system。
- compile:表示编译范围,指A在编译时依赖B,该范围为默认依赖范围。编译范围的依赖会用在编译,测试,运行,由于运行时需要,所以编译范围的依赖会被打包。
- provided:provied依赖只有当jdk或者一个容器已提供该依赖之后才使用。provide依赖在编译和测试时需要,在运行时不需要。例如:servlet api被Tomcat容器提供了。
- runtime:runtime依赖在运行和测试系统时需要,但在编译时不需要。例如:jdbc的驱动包。由于运行时需要,所以runtime范围的依赖会被打包。
- test:test范围依赖在编译和运行时都不需要,只在测试编译和测试运行时需要。例如:Junit。由于运行时不需要,所以test范围依赖不会被打包。
- system:system范围依赖与provide类似,但是必须显示的提供一个对于本地系统中jar文件的路径。一般不推荐使用。
3.项目生命周期
使用Maven完成项目的构建,项目构建包括:清理,编译,部署等过程,maven将这些过程规范为一个生命周期,如下所示是生命周期的各阶段:
4.插件Plugin
Maven管理项目生命周期都是基于插件完成的。
<!-- 设置构建时候的插件 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.1</version> <configuration> <!-- 源代码编译版本 --> <source>1.8</source> <!-- 目标平台编译版本 --> <target>1.8</target> </configuration> </plugin> <!-- 资源插件(资源的插件) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.1</version> <executions> <execution> <phase>compile</phase> </execution> </executions> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- war插件(将项目打成war包) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1</version> <configuration> <!-- war包名字 --> <warName>WebMavenDemo1</warName> </configuration> </plugin> </plugins>
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》