Maven最全详解(看这篇就足够了)

Maven最全详解(看这篇就足够了)-mikechen

Maven定义

Maven 是Apache 的一个开源项目,是Java开发环境中用于管理和构建项目,以及维护依赖关系的强大软件项目管理工具。

 

Maven作用

1.依赖管理

Maven 一个核心的特性就是依赖管理,依赖管理是项目管理中非常重要的一环。

当我们处理多模块的项目,比如:包含成百上千个模块或者子项目,随着这个依赖的树的延伸和扩大,模块间的依赖关系就变得非常复杂,管理也变得很困难。

Maven最全详解(看这篇就足够了)-mikechen

针对此种情形,Maven提供了一套完整的方法,让使用者可以轻松的管理项目的依赖。

2.一键构建

指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理,这个 过程称为构建,使用 maven 一个命令可以轻松完成整个工作。

 

Maven优缺点

1.优点

  • 简化了项目依赖管理;
  • 易于上手,对于新手来说了解几个常用命令即可满足日常工作;
  • 便于与持续集成工具(jenkins)整合;
  • 便于项目升级,无论是项目本身还是项目使用的依赖;
  • maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等。

2.缺点

  • maven是一个庞大的构建系统,学习难度大;
  • maven采用约定优于配置的策略,虽然上手容易,但是一旦出了问题,难于调试。

 

Maven下载安装

1.进入Maven官网下载

地址:https://maven.apache.org/index.html

Maven最全详解(看这篇就足够了)-mikechen

2.下载具体的版本

点击上图的Download下载具体的版本,如下图所示:

Maven最全详解(看这篇就足够了)-mikechen

Binary开头的版本:指的是不需要编译成可执行文件。

Source开头的版本:指的是需要编译成可执行文件。

tar.gz后缀结尾:是Linux的安装包,.zip后缀结尾是windows版本。

比如:选择apache-maven-3.8.6-bin.zip这个就可以,下载完成后解压一下,如下图所示:

Maven最全详解(看这篇就足够了)-mikechen

主要包含4个重要的目录:

bin: 该目录包含了 mvn 运行的脚本,这些脚本用来配置 java 命令;

boot:该目录只包含一个文件,该文件是一个类加载器框架,Maven 使用该框架加载自己的类库;

conf:该目录包含了一个非常重要的文件 settings.xml,用于全局定义 Maven 的行为;

Lib:该目录包含了所有 Maven 运行时需要的 Java 类库;

 

Maven环境配置

1.打开系统设置

首先右击此电脑,属性,打开高级系统设置。

Maven最全详解(看这篇就足够了)-mikechen

2.点击环境变量

Maven最全详解(看这篇就足够了)-mikechen

3.新建系统变量

在系统变量这一栏,选择新建,如下图所示:

Maven最全详解(看这篇就足够了)-mikechen

增加MAVEN_HOME,后面是你解压的Maven目录,如下图所示:

Maven最全详解(看这篇就足够了)-mikechen

之后找系统变量中的Path,点击编辑,如下图所示:

Maven最全详解(看这篇就足够了)-mikechen

输入%MAVEN_HOME%\bin,再点击确定,如下图所示:

Maven最全详解(看这篇就足够了)-mikechen

命令提示符中使用mvn -version来判断是否配置完成。

Maven最全详解(看这篇就足够了)-mikechen

如果出现上图的Maven版本号,就说明你Maven安装配置成功了。

 

Maven运行原理

Maven的实现模型如下图所示:

Maven最全详解(看这篇就足够了)-mikechen

主要包含如下4大组件:

  1. 一个项目对象模 型 (POM:Project Object Model);
  2. 一组标准集合,一个项目生命周期(Project Lifecycle);
  3. 一个依赖管 理系统(Dependency Management System);
  4. 用来运行定义在生命周期阶段(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将这些过程规范为一个生命周期,如下所示是生命周期的各阶段:

Maven最全详解(看这篇就足够了)-mikechen

 

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年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法