4.maven(超牛主讲)

教程 阿布都的都 ⋅ 于 2023-01-06 14:29:35 ⋅ 1086 阅读

Maven基础

1、Maven能够做什么

Maven是专门用于管理和构建Java项目的工具,它的主要功能有:

  • 提供了一套标准化的项目结构
  • 提供了一套标准化的构建流程(编译,测试,打包,发布……)
  • 提供了一套依赖管理机制

1、标准化的项目结构

Maven提供了一套标准化的项目结构,所有IDE使用Maven构建的项目结构完全一样,所有IDE创建的Maven项目可以通用。

file

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

src/main/java:项目java源码

src/main/resources:项目的相关配置文件(比如mybatis配置,xml映射配置,自定义配置文件等)

src/main/webapp:web资源(比如html,css,js等)

src/test/java:测试代码

src/test/resources:测试相关配置文件

pom.xml:项目pom文件

2、标准化的构建流程

Maven提供了一套简单的命令来完成项目构建。

我们开发的每个项目都要经过编译、测试、打包、发布等标准的构建流程,而Maven实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。简单来理解,也就是说Maven提供了一套简单的命令来完成这些工作。

file

3、依赖管理机制

依赖管理其实就是管理你项目所依赖的第三方资源 (jar包、插件…)。

在我们的项目开发中,不可避免的需要使用到一些第三方的jar包。例如,链接数据库的JDBC相关jar包,单元测试的JUnit相关jar包,记录日志的Log4J相关jar包等等。之前手动导入jar包需要:

1.下载 jar 包

2.复制 jar 包到项目

3.将 jar 包加入工作环境

而且,在项目技术升级时,如果涉及到的某个jar包需要升级版本,那么还需要自己调整。并且某个技术很可能还依赖其他的技术,那么相关的的依赖jar包也需要调整版本。这样就会大大增加我们项目的维护成本。

而Maven使用标准的坐标配置来管理各种依赖,只需要简单的配置就可以完成依赖管理。

file

2、Maven简介

Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。

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

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

Maven是用Java语言编写的。他管理的东西统统以面向对象的形式进行设计,最终他把一个项目看成一个对象,而这个对象叫做POM(project object model),即项目对象模型。

file

1、其中的构建生命周期/阶段,指的就是maven构建项目的各种命令。例如:编译、测试、打包、发布等。当然它的这些功能需要使用一些相关的插件来完成,整个生命周期过程中插件是需要配合使用的,单独一个无法完成完整的生命周期。

2、Maven需要编写一个核心的pom.xml文件,Maven通过加载这个配置文件就可以知道我们项目的相关信息了。

3、那Maven是如何帮我们进行项目资源管理的呢?这就需要用到Maven中的第二个东西:依赖管理。这也是它的第二个核心!

所谓依赖管理就是maven对项目所有依赖资源的一种管理,它和项目之间是一种双向关系,即当我们做项目的时候maven的依赖管理可以帮助你去管理你所需要的其他资源,当其他的项目需要依赖我们项目的时候,maven也会把我们的项目当作一种资源去进行管理,这就是一种双向关系。

maven的依赖管理所管理的资源主要有三个位置:本地仓库,远程仓库(私服),中央仓库。

  • 本地仓库:自己计算机上的一个目录

  • 中央仓库:由Maven团队维护的全球唯一的仓库

    ​ 地址:https://repo1.maven.org/maven2/

  • 远程仓库(私服):一般由公司团队搭建的私有仓库

当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:

  • 如果有,则在项目直接引用;

  • 如果没有,则去中央仓库中下载对应的jar包到本地仓库。

还可以搭建远程仓库,将来jar包的查找顺序则变为:

  • 本地仓库 --> 远程仓库 --> 中央仓库

通常,在创建项目初期,会由公司去搭建一个远程仓库(私服),将中央仓库中的jar包同步到远程仓库。一方面提高访问的速度;另一方面,中央仓库中存放的都是一些开源的技术jar包;如果有版权信息的技术jar包,也只能存放于远程仓库中。

file

3、Maven的安装和配置

1.在maven官网下载,解压 apache-maven-3.6.1.rar 即安装完成。

file

​ bin:可执行程序目录

​ boot:maven自身的启动加载器

​ conf:maven配置文件的存放目录

​ lib:maven运行所需库的存放目录

2.配置环境变量 MAVEN_HOME 为安装路径的bin目录

file

3.配置本地仓库:修改 conf/settings.xml 中的 <localRepository> 为一个指定目录

<!-- 配置本地仓库,其中的路径需要自定义 -->
<localRepository>C:/DevelopProgram/apache-maven-3.6.2/repository</localRepository>

4.配置阿里云私服:修改 conf/settings.xml 中的 <mirrors>标签,为其添加如下子标签:

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

file

maven默认连接的远程仓库是中央仓库。此配置的作用是将远程仓库配置为阿里云私服,提高下载速度。

4、Maven的基本使用

4.1、Maven 常用命令

mvn compile :编译 -- 编译项目的源代码

mvn clean:清理 -- 移除上一次构建产生的所有文件

mvn test:测试 -- 使用合适的测试框架运行测试

mvn package:打包 -- 将编译后的代码打包成可分发格式的文件,比如:jar、war或者ear文件。

mvn install:安装 -- 安装项目包到本地仓库,这样当前项目就可以作为其他本地项目的依赖。

4.1.1 手动搭建maven项目

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

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

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

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

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

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

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

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

package com.hainiuxy;

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

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

package com.hainiuxy;

import org.junit.*;
public class DemoTest{

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

}

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

<?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">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hainiuxy</groupId>
    <artifactId>project-java</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>

4.2.4 测试命令

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

file

编辑结果如下:

file

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

file

我们可以进入到target目录查看

file

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

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

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

file

file

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

file

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

file

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

file

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

file

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

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

file

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

此时我们可以去本地仓库中查找

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

file

4.2、Maven 生命周期

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

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

file

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

(1)clean:清理工作

pre-clean:执行一些在clean之前的工作

clean:移除上一次构建产生的所有文件

post-clean:执行一些在clean之后立刻完成的工作

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

这里面的事件非常的多,如下图

file

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

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

pre-site:执行一些在生成站点文档之前的工作

site:生成项目的站点文档

post-site:执行一些在生成站点文档之后完成的工作,为部署做准备

site-deploy:将生成的站点文档部署到特定的服务器上

5、idea配置maven

5.1、在idea中设置maven

file

选择File -- Settings,搜索maven,在右侧设置栏中修改:

Maven home directory: maven的本地安装目录

User settings file: 选择maven安装目录\conf\下的settings.xml文件

Local repository: 会自动调整为配置文件中配置的本地仓库地址

5.2、Maven坐标

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

  • Maven 中的坐标是资源的唯一标识
  • 使用坐标来定义项目或引入项目中需要的依赖

maven坐标的主要组成如下:

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

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

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

packaging:定义资源的打包方式,取值一般有如下三种

(1)jar:该资源打成jar包,默认是jar

(2)war:该资源打成war包

(3)pom:该资源是一个父资源(表明使用maven分模块管理),打包时只生成一个pom.xml不生成jar或其他包结构

file

5.3、在idea中创建maven项目

1.创建模块,选择Maven,点击Next

file

2.填写模块名称,坐标信息,点击finish,创建完成

file

3.编写 HelloWorld,并运行

5.4、在idea中导入maven项目

1.选择右侧Maven面板,点击 + 号

file

2.选中对应项目的pom.xml文件,双击即可

file

3.如果没有Maven面板,选择

View -- Appearance -- Tool Window Bars

file

5.5、配置maven-helper插件

1.选择 IDEA中 File --> Settings

file

2.选择 Plugins

file

3.搜索 Maven,选择第一个 Maven Helper,点击Install安装,弹出面板中点击Accept

file

4.重启 IDEA

file

6、Maven依赖管理

6.1、依赖配置

6.1.1、使用坐标导入jar包

1.在 pom.xml 中编写 标签

2.在 标签中 使用 引入坐标

3.定义坐标的 groupId,artifactId,version

4.点击刷新按钮,使坐标生效

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

file

6.1.2、查找资源的坐标

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

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

输入资源名称进行检索

file

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

file

选择版本查看坐标

file

6.1.3、 使用坐标导入jar包 -- 快捷方式

1.在 pom.xml 中 按 alt + insert,选择 Dependency

file

2.在弹出的面板中搜索对应坐标,然后双击选中对应坐标

file

3.点击刷新按钮,使坐标生效

备注:此方式需要保证本地仓库中已经存在该jar包

6.2、依赖传递

依赖具有传递性。

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

​ 间接依赖:被依赖的资源如果也同时依赖其他资源,当前项目间接依赖其他资源。

file

依赖传递中的冲突问题

路径优先:当依赖中出现相同的资源时,层级越深,优先级越低。

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

6.3、可选依赖

可选依赖指的是对外隐藏当前所依赖的资源。

file

6.4、排除依赖

排除依赖指主动断开依赖的资源。

file

6.5、 依赖范围

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

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

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

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

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

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

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

file

依赖范围的传递性:

file

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-阿布都的都,http://hainiubl.com/topics/76019
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter