【愚公系列】2023年03月 Java教学课程 121-Maven的概念与基本使用

一、Maven基础

1.Maven简介

1.1 Maven是什么

1、Maven的概念

Maven是一款用于Java项目管理和构建的工具,它可以自动化构建过程,包括编译、测试、打包、发布等。Maven提供了一种标准化的项目结构和管理方式,可以帮助开发者更好地管理依赖关系、版本控制、构建和部署等方面的问题。Maven使用XML文件来描述项目的构建过程,以及依赖关系和其他相关配置信息。它是Java社区中使用最广泛的构建工具之一。

2、Maven的pom模型

Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)。

在这里插入图片描述

Maven的pom.xml是一个XML文件,用于描述Maven项目的配置信息,包括项目的依赖关系、构建过程、打包方式、插件等等。

该文件通常位于项目根目录下,文件名为pom.xml。在该文件中,可以指定项目的基本信息,如项目名称、版本号、作者、许可证等;定义项目的依赖关系,通过依赖管理机制可以自动下载和管理所需的依赖库;配置构建过程,定义构建的目标、输出文件的路径和名称等;以及配置插件,用于扩展构建过程。

3、Maven的依赖管理

Maven的依赖管理是指通过Maven管理项目中所需要的各种依赖库和组件。Maven通过一种称为POM(Project Object Model,项目对象模型)的方式来描述项目和依赖关系。在POM中,可以指定项目所依赖的库和组件的版本号、URL地址等信息,Maven会自动下载和安装这些依赖项,并将它们放置在特定的目录中,供项目使用。

Maven的依赖管理具有以下特点:

  • 自动管理依赖:Maven会自动下载和安装项目所需要的依赖项,无需手动添加和管理。
  • 版本控制:Maven会自动解决依赖项中的版本冲突,确保项目中所有依赖项的版本是兼容的。
  • 中央仓库:Maven提供了一个中央仓库,包含了大量的开源库和组件,可以直接使用。
  • 依赖范围:Maven支持指定依赖项的范围,例如compile、test、runtime等,以控制依赖项的使用范围。
  • 依赖传递:Maven自动处理依赖项的传递性,即如果A依赖于B,而B又依赖于C,那么Maven会自动下载和安装B和C,并将它们添加到A的依赖项中。

Maven的依赖管理使得项目的构建和管理更加简单和可靠,减少了手动管理依赖项的复杂性和错误。

Maven除了帮我们管理项目资源之外还能帮助我们对项目进行构建,管理项目的整个生命周期,当然它的这些功能需要使用一些相关的插件来完成,当然整个生命周期过程中插件是需要配合使用的,单独一个无法完成完整的生命周期。

1.2 Maven的作用

Maven的作用我们可以分成三类:

  • 项目构建:提供标准的,跨平台的自动化构建项目的方式
  • 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突等问题
  • 统一开发结构:提供标准的,统一的项目开发结构
在这里插入图片描述

各目录存放资源类型说明:

  • src/main/java:项目java源码
  • src/main/resources:项目的相关配置文件(比如mybatis配置,xml映射配置,自定义配置文件等)
  • src/main/webapp:web资源(比如html,css,js等)
  • src/test/java:测试代码
  • src/test/resources:测试相关配置文件
  • src/pom.xml:项目pom文件

2.Maven环境搭建

maven的官网:http://maven.apache.org/

在这里插入图片描述

2.1 下载

官方下载地址:http://maven.apache.org/download.cgi

在这里插入图片描述

2.2 安装

maven是一个绿色软件,解压即安装,非常容易,

将下载的apache-maven-3.9.1-bin.zip直接解压到D盘根目录下即可

解压完成后我们可以查看一下maven自己的一个目录结构如下

在这里插入图片描述

各目录结构说明:

  • bin:可执行程序目录,
  • boot:maven自身的启动加载器
  • conf:maven配置文件的存放目录
  • lib:maven运行所需库的存放目录

2.3 环境配置

maven的运行需要java的环境,需要我们配置JAVA_HOME环境变量,这个相信大家已经存在了

下面在去配置MAVEN_HOME的环境变量

1:我的电脑-------->属性--------->高级系统设置---------->新建系统变量MAVEN_HOME

在这里插入图片描述

2:环境变量配置好之后需要测试环境配置结果,我们需要在DOS命令窗口下输入以下命令查看输出

代码语言:javascript
复制
mvn -v
在这里插入图片描述

如果能够看到输出的maven的版本信息代表配置成功

3.Maven基础概念

3.1 仓库

仓库:用于存储资源,主要是各种jar包

在这里插入图片描述

关于仓库,我们前面讲到了有三种:本地仓库,私服,中央仓库,其中私服和中央仓库都属于远程仓库

  • 中央仓库:maven团队自身维护的仓库,属于开源的
  • 私服:各公司/部门等小范围内存储资源的仓库,私服也可以从中央仓库获取资源
  • 本地仓库:开发者自己电脑上存储资源的仓库,也可从远程仓库获取资源

私服的作用:

  • 保存具有版权的资源,包含购买或自主研发的jar
  • 一定范围内共享资源,能做到仅对内不对外开放

3.2 坐标

我们说maven的仓库里存储了各种各样的资源(jar包),那这些资源我们如何找到它们呢?我们需要知道它们具体的一个位置才能知道如何找到它们,这个就叫坐标

坐标:maven中的坐标用于描述仓库中资源的位置

https://repo1.maven.org/maven2/

那maven中的坐标是如何构成的呢?

maven坐标的主要组成如下:

groupId:定义当前资源隶属组织名称(通常是域名反写,如:org.mybatis;com.itheima)

artifactId:定义当前资源的名称(通常是项目或模块名称,如:crm,sms)

version:定义当前资源的版本号

packaging:定义资源的打包方式,取值一般有如下三种 (1)jar:该资源打成jar包,默认是jar (2)war:该资源打成war包 (3)pom:该资源是一个父资源(表明使用maven分模块管理),打包时只生成一个pom.xml不生成jar或其他包结构

如果要查询maven某一个资源的坐标,我们通常可以去maven的仓库进行查询,

https://mvnrepository.com/,在该网站中可直接搜索想要的资源,然后就能得到该资源的坐标

输入资源名称进行检索

在这里插入图片描述

点击你想要的资源进行查看

在这里插入图片描述

选择版本查看坐标

在这里插入图片描述

maven坐标的作用:

使用唯一标识,唯一性定义资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。

3.3 仓库配置

开发者要在自己电脑上做开发,首先要做的就是配置本地仓库

默认情况下maven本地仓库的位置在哪儿呢?

我们可以选择在全局进行配置,在maven的配置文件conf/settings.xml中可以找到它的说明

代码语言:javascript
复制
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->

也就是在系统盘当前用户目录下的.m2/repository,比如我当前的系统用户是zs,则默认的本地仓库仓库位置在C:\Users\zs\.m2\repository

因为我们平时开发项目所有的资源会比较多,而且各种资源还有好多的版本,资源与资源之间还有相互依赖的这种情况,因此本地仓库保存的内容会非常的多,它的体积会很大,如果放在C盘下不太合适,因此我们可以自己来指定一个位置作为本地仓库的位置,这个指定同样是需要来修改maven的配置文件conf/settings.xml

在我们前面查看这个文件的时候大家会发现它提供了一个标签<localRepository>/path/to/local/repo</localRepository>

这个标签中配置的值就是我们本地仓库的位置,但是这个标签是在注释中的,也就是说目前不起作用,因此我们要将该标签挪出注释,并修改标签内的值,指定一个新的位置作为本地仓库的位置,例如

代码语言:javascript
复制
  <!-- 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:\maven-repository</localRepository>

如果是局部用户配置:在仓库的同级目录也可以包含一个settings.xml配置文件,在里面也可以进行指定。

maven默认连接的远程仓库位置是:(即中央仓库)此站点并不在国内,因此有时候下载速度非常慢,因此我们可以配置一个国内站点镜像,可用于加速下载资源

我们在conf/settings.xml配置文件中找到<mirrors>标签,在这组标签下添加镜像的配置,如下

代码语言:javascript
复制
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

4.Maven项目搭建

4.1 手动搭建maven项目

我们先使用手动的方式来创建maven项目

(1)在D盘下创建目录maven-project并进入该目录,作为我们的操作目录

(2)创建我们的maven项目,创建一个目录java01作为我们的项目文件夹,并进入到该目录

(3)创建java代码(源代码)所在目录,即创建src/main/java

(4)创建配置文件所在目录,即创建src/main/resources

(5)创建测试源代码所在目录,即创建src/test/java

(6)创建测试存放配置文件存放目录,即src/test/resources

(7)在src/main/java中创建一个包(注意在windos文件夹下就是创建目录)com/itheima,在该目录下创建Demo.java文件,作为演示所需java程序,内容如下

代码语言:javascript
复制
package com.itheima;

public class Demo{
public String say(String name){
System.out.println("hello "+name);
return "hello "+name;
}
}

(8)在src/test/java中创建一个测试包(目录)com/itheima,在该包下创建测试程序DemoTest.java

代码语言:javascript
复制
package com.itheima;

import org.junit.*;
public class DemoTest{

@Test
public void testSay(){
	Demo d = new Demo();
	String ret = d.say(&#34;maven&#34;);
	Assert.assertEquals(&#34;hello maven&#34;,ret);
}

}

(9)在project-java/src下创建pom.xml文件,编辑如下

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">

&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

&lt;groupId&gt;com.itheima&lt;/groupId&gt;
&lt;artifactId&gt;project-java&lt;/artifactId&gt;
&lt;version&gt;1.0&lt;/version&gt;
&lt;packaging&gt;jar&lt;/packaging&gt;

&lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;junit&lt;/groupId&gt;
        &lt;artifactId&gt;junit&lt;/artifactId&gt;
        &lt;version&gt;4.12&lt;/version&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;

</project>

通过前面的操作,我们已经搭建好了maven的项目结构,下面要通过maven来构建我们的项目

maven的构建命令以mvn开头,后面添加功能参数,可以一次性执行多个命令,用空格分离

  • mvn compile:编译
  • mvn clean:清理
  • mvn test:测试
  • mvn package:打包
  • mvn install:安装到本地仓库

下面我们来进行操作:

(1)在项目project-java所在的DOS命令窗口下执行mvn compile进行源码编译,当然首次执行需要先下载相关插件

在这里插入图片描述

编译完成后在项目project-java下多了一个目录target,在这个目录下就存放的是maven编译好的一些东西

在这里插入图片描述

其中生成的classes目录就是编译好的字节码文件

(2)当然如果我们想清理掉这些东西,我们只需执行mvn clean命令即可,清理掉后target目录也就消失了

(3)如果我们要执行测试包中的测试程序,我们只需执行mvn test命令即可

在这里插入图片描述

此时在看target目录会多一些东西

在这里插入图片描述

其中产生的test-classes就是测试代码的字节码文件,surefire-reports是它产生的测试报告

在这里插入图片描述

(4)使用mvn package命令进行打包,如下

在这里插入图片描述

在生成的target目录中可以看到打包的结果

在这里插入图片描述

当然,如果仔细看DOS窗口输出的我们会发现,mvn package命令的时候maven会把前面两个命令mvn compile,mvn test都执行一遍

(5)使用mvn install命令进行安装,将项目打好的包存入本地仓库

在这里插入图片描述

仔细查看输出会发现mvn install命令执行的时候也会将前面的命令都执行一遍

此时我们可以去本地仓库中查找,如何查找?这个很重要

maven是按照groupId/artifactId/version的结构在本地仓库进行存储

在这里插入图片描述

前面我们是通过手动的方式创建的maven项目,相对来说比较的麻烦,maven本身也是这样觉得的,因此maven本身就给我们提供了相关的插件来帮助我们快速构建项目,当然这是一些命令:

在这里插入图片描述

这些命令不用记,因为实际操作的时候也用不着,因为实际开发的时候我们基本都是用过一些IDE工具来进行项目开发,这些IDE工具基本都集成了Maven,我们操作起来非常简单。

4.2 IDEA工具搭建maven项目

前面学习的基本都是通过命令来构建和管理项目,但是这在实际开发过程中基本不常用,常用的是通过相关IDE工具来进行项目的构建和管理,因此我们使用IDEA工具进行maven项目的搭建

需要注意的是:Maven和IDEA在版本上存在一些兼容性问题,因为要合理的选择Maven和IDEA的版本。

4.2.1 不使用原型创建项目

(1)在IDEA中配置Maven

在这里插入图片描述

(2)创建maven工程

在这里插入图片描述

(3)填写本项目的坐标

在这里插入图片描述

(4)查看各目录颜色标记是否正确

在这里插入图片描述

(5)IDEA右侧有一个maven管理界面,可点开查看

在这里插入图片描述

(6)在项目的pom.xml文件中添加项目资源依赖

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>
在这里插入图片描述

(7)创建源代码:com.itheima.Demo

代码语言:javascript
复制
package com.itheima;

public class Demo{
public String say(String name){
System.out.println("hello "+name);
return "hello "+name;
}
}

(8)创建测试代码:com.itheima.DemoTest

代码语言:javascript
复制
package com.itheima;

import org.junit.Assert;
import org.junit.Test;

public class DemoTest{

@Test
public void testSay(){
    Demo d = new Demo();
    String ret = d.say(&#34;maven&#34;);
    Assert.assertEquals(&#34;hello maven&#34;,ret);
}

}

在这里插入图片描述
4.2.2 使用原型创建项目
  • 首先我们来看普通的java工程如何创建:

(1)创建maven项目的时候选择使用原型骨架

在这里插入图片描述

(2)创建完成后发现通过这种方式缺少一些目录,如下图

在这里插入图片描述

(3)web工程创建好之后需要启动运行,需要使用一个tomcat插件来运行我们的项目,在pom.xml中添加插件的坐标即可,最终改好的pom.xml如下

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<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>

&lt;groupId&gt;org.example&lt;/groupId&gt;
&lt;artifactId&gt;javamaveny&lt;/artifactId&gt;
&lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
&lt;packaging&gt;war&lt;/packaging&gt;

&lt;name&gt;web01 Maven Webapp&lt;/name&gt;
&lt;url&gt;http://www.example.com&lt;/url&gt;

&lt;properties&gt;
    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
    &lt;maven.compiler.source&gt;11&lt;/maven.compiler.source&gt;
    &lt;maven.compiler.target&gt;11&lt;/maven.compiler.target&gt;
&lt;/properties&gt;
&lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;junit&lt;/groupId&gt;
        &lt;artifactId&gt;junit&lt;/artifactId&gt;
        &lt;version&gt;4.12&lt;/version&gt;
        &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;

&lt;build&gt;
    &lt;finalName&gt;web01&lt;/finalName&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.tomcat.maven&lt;/groupId&gt;
            &lt;artifactId&gt;tomcat7-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;2.1&lt;/version&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

</project>

(4)插件配置好后,在IDEA右侧maven-project操作面板上可以看到该插件,并且可以利用该插件启动项目

在这里插入图片描述

运行后该插件会给我们一个可运行地址:

在这里插入图片描述

如果我们想更换端口,只需要在pom.xml中配置该插件即可

代码语言:javascript
复制
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
</configuration>
</plugin>

(5)同时为了运行方便我们也可以创建运行模板:

在这里插入图片描述

5.Maven依赖管理

5.1 依赖配置与依赖传递

依赖是指在当前项目中运行所需的jar,依赖配置的格式如下图

在这里插入图片描述

依赖传递:

依赖具有传递性,分两种

(1)直接依赖:在当前项目中通过依赖配置建立的依赖关系

(2)间接依赖:被依赖的资源如果依赖其他资源,则表明当前项目间接依赖其他资源

注意:直接依赖和间接依赖其实也是一个相对关系

在这里插入图片描述

依赖传递的冲突问题:

在依赖传递过程中产生了冲突,我们有三种优先法则

(1)路径优先:当依赖中出现相同资源时,层级越深,优先级越低,反之则越高

(2)声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖靠后的

(3)特殊优先:当同级配置了相同资源的不同版本时,后配置的覆盖先配置的

在这里插入图片描述

可选依赖

在这里插入图片描述

排除依赖:

在这里插入图片描述

5.2 依赖范围

依赖的jar默认情况可以在任何地方可用,可以通过scope标签设定其作用范围

这里的范围主要是指以下三种范围

(1)主程序范围有效(src/main目录范围内)

(2)测试程序范围内有效(src/test目录范围内)

(3)是否参与打包(package指令范围内)

此外:scope标签的取值有四种:compile,test,provided,runtime

这四种取值与范围的对应情况如下:

在这里插入图片描述

依赖范围的传递性:

在这里插入图片描述

6.Maven生命周期与插件

6.1 生命周期

maven的构建生命周期描述的是一次构建过程经历了多少个事件

比如我们项目最常用的一套流程如下:

在这里插入图片描述

当然maven的生命周期不止这一套,总共分为3套,每套里面包含的事件如下

(1)clean:清理工作

pre-clean:执行一些在clean之前的工作 clean:移除上一次构建产生的所有文件 post-clean:执行一些在clean之后立刻完成的工作

(2)default:核心工作,例如编译,测试,打包,部署等

这里面的事件非常的多,如下图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nktQIJFh-1680076281398)(./img/53.png)]

对于default生命周期,每个事件在执行之前都会将之前的所有事件依次执行一遍

(3)site:产生报告,发布站点等

pre-site:执行一些在生成站点文档之前的工作 site:生成项目的站点文档 post-site:执行一些在生成站点文档之后完成的工作,为部署做准备 site-deploy:将生成的站点文档部署到特定的服务器上

6.2 插件

前面我们讲了maven生命周期中的相关事件,那这些事件是谁来执行的呢?答案是maven的插件

插件:

  • 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件
  • maven默认在各个生命周期上都绑定了预先设定的插件来完成相应功能
  • 插件还可以完成一些自定义功能

插件的配置方式如下:

在这里插入图片描述

在maven官网中有对插件的介绍:

http://maven.apache.org/plugins/index.html

在这里插入图片描述