• maven学习笔记——感谢尚硅谷官方文档


    maven学习笔记——感谢尚硅谷官方文档

    仅自用,如有侵权,立刻删!——感谢【尚硅谷】官方文档

    🥽 Maven概述

    🌊 Maven的功能

    1、Maven 作为依赖管理工具

    随着我们使用越来越多的框架,或者框架封装程度越来越高,项目中使用的jar包也越来越多。项目中,一个模块里面用到上百个jar包是非常正常的。jar包所属技术的官网通常是英文界面,网站的结构又不尽相同,甚至找到下载链接还发现需要通过特殊的工具下载。框架中使用的 jar 包,不仅数量庞大,而且彼此之间存在错综复杂的依赖关系。jar 包之间有可能产生冲突。进一步增加了我们在 jar 包使用过程中的难度。

    使用 Maven 后,依赖对应的 jar 包能够自动下载,方便、快捷又规范。使用 Maven 则几乎不需要管理 jar 包彼此之间存在错综复杂的依赖关系,极个别的地方调整一下即可,极大的减轻了我们的工作量。

    2、Maven 作为构建管理工具

    脱离 IDE 环境仍需构建
    在这里插入图片描述

    🌊 Maven简介

    Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。

    💦 构建
    • Java 项目开发过程中,构建指的是使用『原材料生产产品』的过程。
      • 原材料
        • Java 源代码
        • 基于 HTML 的 Thymeleaf 文件
        • 图片
        • 配置文件
        • ……
      • 产品
        • 一个可以在服务器上运行的项目
    • 构建过程包含的主要的环节:
      • 清理:删除上一次构建的结果,为下一次构建做好准备
      • 编译:Java 源程序编译成 *.class 字节码文件
      • 测试:运行提前准备好的测试程序
      • 报告:针对刚才测试的结果生成一个全面的信息
      • 打包
        • Java工程:jar包
        • Web工程:war包
      • 安装:把一个 Maven 工程经过打包操作生成的 jar 包或 war 包存入Maven的本地仓库
      • 部署
        • 部署 jar 包:把一个 jar 包部署到 Nexus 私服服务器上
        • 部署 war 包:借助相关 Maven 插件(例如 cargo),将 war 包部署到 Tomcat 服务器上
    💦 依赖

    如果 A 工程里面用到了 B 工程的类、接口、配置文件等等这样的资源,那么我们就可以说 A 依赖 B。

    • 依赖管理中要解决的具体问题:
      • jar 包的下载:使用 Maven 之后,jar 包会从规范的远程仓库下载到本地
      • jar 包之间的依赖:通过依赖的传递性自动完成
      • jar 包之间的冲突:通过对依赖的配置进行调整,让某些jar包不会被导入
    💦 Maven 的工作机制

    🥽 Maven核心程序解压和配置

    🌊 Maven 核心程序解压与配置

    💦 下载

    【Maven官网地址】

    【Maven下载地址】

    在这里插入图片描述

    💦 解压Maven核心程序

    在这里插入图片描述

    在解压目录中,我们需要着重关注 Maven 的核心配置文件:conf/settings.xml

    Maven无需安装,将下载的压缩包解压后,即可直接使用
    在这里插入图片描述

    💦 指定Maven的本地仓库

    Maven本地仓库默认值:用户家目录/.m2/repository。

    在这里插入图片描述
    在这里插入图片描述

    由于本地仓库的默认位置是在用户的家目录下,而家目录往往是在 C 盘,也就是系统盘。将来 Maven 仓库中 jar 包越来越多,仓库体积越来越大,可能会拖慢 C 盘运行速度,影响系统性能。所以建议将 Maven 的本地仓库放在其他盘符下。配置方式如下:

    
    
    <localRepository>E:\Maven\maven-repositorylocalRepository>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    记住:一定要把 localRepository 标签从注释中拿出来。

    注意:本地仓库本身也需要使用一个非中文、没有空格的目录。

    💦 配置阿里云提供的镜像仓库

    Maven 下载 jar 包默认访问境外的中央仓库,而国外网站速度很慢。改成阿里云提供的镜像仓库,访问国内网站,可以让 Maven 下载 jar 包的时候速度更快。配置的方式是:

    💧 将原有的例子配置注释掉
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    💧 加入我们的配置

    将下面 mirror 标签整体复制到 settings.xml 文件的 mirrors 标签的内部。

      <mirror>
        <id>nexus-aliyunid>
        <mirrorOf>centralmirrorOf> 
        <name>Nexus aliyunname>  
        <url>http://maven.aliyun.com/nexus/content/groups/publicurl>
      mirror>  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    💦 配置 Maven 工程的基础 JDK 版本

    如果按照默认配置运行,Java 工程使用的默认 JDK 版本是 1.5,而我们熟悉和常用的是 JDK 1.8 版本。修改配置的方式是:将 profile 标签整个复制到 settings.xml 文件的 profiles 标签内,指定使用的JDK版本为1.8。

      <profile>
        <id>jdk-1.8id>
        <activation>
        <activeByDefault>trueactiveByDefault>
        <jdk>1.8jdk>
        activation>
        <properties>
        <maven.compiler.source>1.8maven.compiler.source>
        <maven.compiler.target>1.8maven.compiler.target>
        <maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
        properties>
      profile>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    🌊 配置环境变量

    💦 检查 JAVA_HOME 配置是否正确

    Maven 是一个用 Java 语言开发的程序,它必须基于 JDK 来运行,需要通过 JAVA_HOME 来找到 JDK 的安装位置。

    在这里插入图片描述

    可以使用下面的命令验证:

    C:\Users\Administrator>echo %JAVA_HOME%
    D:\software\Java
    
    C:\Users\Administrator>java -version
    java version "1.8.0_141"
    Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    💦 配置 MAVEN_HOME

    XXXX_HOME 通常为bin目录的上一级。

    在这里插入图片描述
    在这里插入图片描述

    💦 配置PATH

    PATH 指的是bin目录

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    💦 验证
    C:\Users\Administrator>mvn -v
    Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)
    Maven home: D:\software\apache-maven-3.8.4
    Java version: 1.8.0_141, vendor: Oracle Corporation, runtime: D:\software\Java\jre
    Default locale: zh_CN, platform encoding: GBK
    OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    🥽 使用Maven:命令行

    🌊 根据坐标创建 Maven 工程

    💦 Maven 核心概念:坐标
    💧 数学中的坐标

    在这里插入图片描述

    使用 x、y、z 三个『向量』作为空间的坐标系,可以在『空间』中唯一的定位到一个『点』。

    💧 Maven中的坐标
    💧💧向量说明

    使用三个『向量』在『Maven的仓库』中唯一的定位到一个『jar』包。

    • groupId:公司或组织的 id
    • artifactId:一个项目或者是项目中的一个模块的 id(更偏向于项目中的一个模块或一个没有进行拆分的项目)
    • version:版本号

    一个公司中有多个项目,每个项目中有多个工程
    一个项目在实现的时候,会拆分出多个模块,每个模块是一个工程

    💧💧三个向量的取值方式
    • groupId:公司或组织域名的倒序,通常也会加上项目名称(为了区别项目这一层)
      • 例如:com.atguigu.maven
    • artifactId:模块的名称,将来作为 Maven 工程的工程名
    • version:模块的版本号,根据自己的需要设定
      • 例如:SNAPSHOT 表示快照版本,正在迭代过程中,不稳定的版本
      • 例如:RELEASE 表示正式版本

    举例:

    • groupId:com.atguigu.maven
    • artifactId:pro01-atguigu-maven
    • version:1.0-SNAPSHOT
    💧 坐标和仓库中 jar 包的存储路径之间的对应关系

    坐标:

      javax.servlet
      servlet-api
      2.5
    
    • 1
    • 2
    • 3

    上面坐标对应的 jar 包在 Maven 本地仓库中的位置:

    Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar
    
    • 1

    一定要学会根据坐标到本地仓库中找到对应的 jar 包。

    💦 实验操作
    💧 创建目录作为后面操作的工作空间

    其实就是一个普通的目录,在这个目录下我们要去写代码、开发应用程序

    例如:D:\maven-workspace\space201026

    此时我们已经有了三个目录,分别是:
    ★Maven 核心程序:中军大帐
    ★Maven 本地仓库:兵营
    ★本地工作空间:战场

    在这里插入图片描述

    💧 在工作空间目录下打开命令行窗口

    在这里插入图片描述

    💧 使用命令生成Maven工程

    在这里插入图片描述

    运行 mvn archetype:generate 命令

    下面根据提示操作

    Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7:【直接回车,使用默认值】
    
    Define value for property 'groupId': com.atguigu.maven
    
    Define value for property 'artifactId': pro01-maven-java
    
    Define value for property 'version' 1.0-SNAPSHOT: :【直接回车,使用默认值】
    
    Define value for property 'package' com.atguigu.maven: :【直接回车,使用默认值】
    
    Confirm properties configuration: groupId: com.atguigu.maven artifactId: pro01-maven-java version: 1.0-SNAPSHOT package: com.atguigu.maven Y: :【直接回车,表示确认。如果前面有输入错误,想要重新输入,则输入 N 再回车。】
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    第一次执行会下载插件依赖等,将下载的放在配置的Maven本地仓库中。

    在这里插入图片描述

    在这里插入图片描述

    选择创建项目的模式,默认选择7,快速开始

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    💧 调整

    Maven 默认生成的工程,对 junit 依赖的是较低的 3.8.1 版本,我们可以改成较适合的 4.12 版本。

    在创建的工程的配置文件pom.xml中进行修改:

    
    
    <dependencies>
      
      <dependency>
        
        <groupId>junitgroupId>
        <artifactId>junitartifactId>
        <version>4.12version>
        
        
        <scope>testscope>
      dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    自动生成的 App.java 和 AppTest.java 可以删除。

    在这里插入图片描述

    💧 自动生成的 pom.xml 解读
    
    <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.0modelVersion>
    
      
      
      <groupId>com.cw.mavengroupId>
      
      <artifactId>pro01-maven-javaartifactId>
       
      <version>1.0-SNAPSHOTversion>
      
      
      
      
      
      <packaging>jarpackaging>
    
      <name>pro01-maven-javaname>
      <url>http://maven.apache.orgurl>
    
      
      
      <properties>
        
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
      properties>
    
      
      
      
      <dependencies>
        
        <dependency>
          
          
          <groupId>junitgroupId>
          <artifactId>junitartifactId>
          <version>4.12version>
          
          <scope>testscope>
        dependency>
      dependencies>
    project>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    💦 Maven核心概念:POM
    💧 含义

    POM:Project Object Model,项目对象模型。和 POM 类似的是:DOM(Document Object Model),文档对象模型。它们都是模型化思想的具体体现。

    💧 模型化思想

    POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法就是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这样就可以在程序中计算与现实事物相关的数据。

    💧 对应的配置文件

    POM 理念集中体现在 Maven 工程根目录下 pom.xml 这个配置文件中。所以这个 pom.xml 配置文件就是 Maven 工程的核心配置文件。其实学习 Maven 就是学这个文件怎么配置,各个配置有什么用。

    💦 Maven核心概念:约定的目录结构
    💧 各个目录的作用

    另外还有一个 target 目录专门存放构建操作输出的结果。

    💧 约定目录结构的意义

    Maven 为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用。例如:Maven 执行编译操作,必须先去 Java 源程序目录读取 Java 源代码,然后执行编译,最后把编译结果存放在 target 目录。

    💧 约定大于配置

    Maven 对于目录结构这个问题,没有采用配置的方式,而是基于约定。这样会让我们在开发过程中非常方便。如果每次创建 Maven 工程后,还需要针对各个目录的位置进行详细的配置,那肯定非常麻烦。

    目前开发领域的技术发展趋势就是:约定大于配置,配置大于编码。

    🌊 在 Maven 工程中编写代码

    💦 主体程序

    在这里插入图片描述

    主体程序指的是被测试的程序,同时也是将来在项目中真正要使用的程序。

    package com.atguigu.maven;
      
    public class Calculator {
      
      public int sum(int i, int j){
        return i + j;
      }
      
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    💦 测试程序

    package com.atguigu.maven;
      
    import org.junit.Test;
    import com.atguigu.maven.Calculator;
      
    // 静态导入的效果是将Assert类中的静态资源导入当前类
    // 这样一来,在当前类中就可以直接使用Assert类中的静态资源,不需要写类名
    import static org.junit.Assert.*;
      
    public class CalculatorTest{
      
      @Test
      public void testSum(){
        
        // 1.创建Calculator对象
        Calculator calculator = new Calculator();
        
        // 2.调用Calculator对象的方法,获取到程序运行实际的结果
        int actualResult = calculator.sum(5, 3);
        
        // 3.声明一个变量,表示程序运行期待的结果
        int expectedResult = 8;
        
        // 4.使用断言来判断实际结果和期待结果是否一致
        // 如果一致:测试通过,不会抛出异常
        // 如果不一致:抛出异常,测试失败
        assertEquals(expectedResult, actualResult);
        
      }
      
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    🌊 执行 Maven 的构建命令

    💦 要求

    运行 Maven 中和构建操作相关的命令时,必须进入到 pom.xml 所在的目录。如果没有在 pom.xml 所在的目录运行 Maven 的构建命令,那么会看到下面的错误信息:

    The goal you specified requires a project to execute but there is no POM in this directory
    
    • 1

    mvn -v 命令和构建操作无关,只要正确配置了 PATH,在任何目录下执行都可以。而构建相关的命令要在 pom.xml 所在目录下运行——操作哪个工程,就进入这个工程的 pom.xml 目录。

    在这里插入图片描述

    💦 清理操作

    mvn clean

    效果:删除 target 目录

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    💦 编译操作

    主程序编译:mvn compile
    在这里插入图片描述

    测试程序编译:mvn test-compile
    在这里插入图片描述

    主体程序编译结果存放的目录:target/classes
    在这里插入图片描述

    测试程序编译结果存放的目录:target/test-classes
    在这里插入图片描述

    💦 测试操作

    mvn test

    测试的报告存放的目录:target/surefire-reports

    进行测试操作,Maven会自动执行主程序和测试程序的编译操作

    在这里插入图片描述
    在这里插入图片描述

    💦 打包操作

    mvn package

    打包的结果——jar 包,存放的目录:target

    进行打包操作,Maven会自动执行主程序和测试程序的编译操作,以及测试程序的允许

    在这里插入图片描述
    在这里插入图片描述

    💦 安装操作

    mvn install

    [INFO] Installing D:\maven-workspace\space201026\pro01-maven-java\target\pro01-maven-java-1.0-SNAPSHOT.jar to D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.jar
    [INFO] Installing D:\maven-workspace\space201026\pro01-maven-java\pom.xml to D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.pom
    
    • 1
    • 2

    安装的效果是将本地构建过程中生成的 jar 包存入 Maven 本地仓库。这个 jar 包在 Maven 仓库中的路径是根据它的坐标生成的。

    坐标信息如下:

      com.atguigu.maven
      pro01-maven-java
      1.0-SNAPSHOT
    
    • 1
    • 2
    • 3

    在 Maven 仓库中生成的路径如下:

    D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.jar
    
    • 1

    另外,安装操作还会将 pom.xml 文件转换为 XXX.pom 文件一起存入本地仓库。所以我们在 Maven 的本地仓库中想看一个 jar 包原始的 pom.xml 文件时,查看对应 XXX.pom 文件即可,它们是名字发生了改变,本质上是同一个文件。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    命令可以组合执行,如 mvn clean install 相当于清理操作和安装操作同时执行

    🌊 创建 Maven 版的 Web 工程

    💦 说明

    使用 mvn archetype:generate 命令生成 Web 工程时,需要使用一个专门的 archetype。这个专门生成 Web 工程骨架的 archetype 可以参照官网看到它的用法:

    参数 archetypeGroupId、archetypeArtifactId、archetypeVersion 用来指定现在使用的 maven-archetype-webapp 的坐标。

    💦 操作

    注意:如果在上一个工程的目录下执行 mvn archetype:generate 命令,那么 Maven 会报错:不能在一个非 pom 的工程下再创建其他工程。所以不要再刚才创建的工程里再创建新的工程,请回到工作空间根目录来操作。

    然后运行生成工程的命令:

    mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
    
    • 1

    在这里插入图片描述

    下面的操作按照提示执行:

    Define value for property 'groupId': com.atguigu.maven Define value for property 'artifactId': pro02-maven-web Define value for property 'version' 1.0-SNAPSHOT: :【直接回车,使用默认值】
    
    Define value for property 'package' com.atguigu.maven: :【直接回车,使用默认值】 Confirm properties configuration: groupId: com.atguigu.maven artifactId: pro02-maven-web version: 1.0-SNAPSHOT package: com.atguigu.maven Y: :【直接回车,表示确认】
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    💦 生成的pom.xml

    确认打包的方式是war包形式

    war
    
    • 1

    在这里插入图片描述

    💦 生成的Web工程的目录结构

    webapp 目录下有 index.jsp

    WEB-INF 目录下有 web.xml

    💦 创建 Servlet
    💧 在 main 目录下创建 java 目录

    在这里插入图片描述

    💧 在 java 目录下创建 Servlet 类所在的包的目录

    在这里插入图片描述

    💧 在包下创建 Servlet 类

    在这里插入图片描述

    package com.atguigu.maven;
      
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.ServletException;
    import java.io.IOException;
      
    public class HelloServlet extends HttpServlet{
      
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.getWriter().write("hello maven web");
        
      }
      
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    💧 在 web.xml 中注册 Servlet
      <servlet>
        <servlet-name>helloServletservlet-name>
        <servlet-class>com.atguigu.maven.HelloServletservlet-class>
      servlet>
      <servlet-mapping>
        <servlet-name>helloServletservlet-name>
        <url-pattern>/helloServleturl-pattern>
      servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    💦 在 index.jsp 页面编写超链接
    <html>
    <body>
    <h2>Hello World!h2>
    <a href="helloServlet">Access Servleta>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    JSP全称是 Java Server Page,和 Thymeleaf 一样,是服务器端页面渲染技术。这里我们不必关心 JSP 语法细节,编写一个超链接标签即可。

    💦 编译

    此时直接执行 mvn compile 命令出错:

    程序包 javax.servlet.http 不存在
    
    程序包 javax.servlet 不存在
    
    找不到符号
    
    符号: 类 HttpServlet
    
    ……
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    上面的错误信息说明:我们的 Web 工程用到了 HttpServlet 这个类,而 HttpServlet 这个类属于 servlet-api.jar 这个 jar 包。此时我们说,Web 工程需要依赖 servlet-api.jar 包。

    在这里插入图片描述

    💦 配置对 servlet-api.jar 包的依赖

    对于不知道详细信息的依赖可以到https://mvnrepository.com/网站查询。使用关键词搜索,然后在搜索结果列表中选择适合的使用。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    比如,我们找到的 servlet-api 的依赖信息:

    
    <dependency>
        <groupId>javax.servletgroupId>
        <artifactId>javax.servlet-apiartifactId>
        <version>3.1.0version>
        <scope>providedscope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这样就可以把上面的信息加入 pom.xml。重新执行 mvn compile 命令。

    在这里插入图片描述

    💦 将 Web 工程打包为 war 包

    运行 mvn package 命令,生成 war 包的位置如下图所示:

    在这里插入图片描述
    在这里插入图片描述

    💦 将 war 包部署到 Tomcat 上运行

    将 war 包复制到 Tomcat/webapps 目录下

    在这里插入图片描述

    Tomcat会自动解压war包

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    🌊 让 Web 工程依赖 Java 工程

    💦 观念

    明确一个意识:从来只有 Web 工程依赖 Java 工程,没有反过来 Java 工程依赖 Web 工程。本质上来说,Web 工程依赖的 Java 工程其实就是 Web 工程里导入的 jar 包。最终 Java 工程会变成 jar 包,放在 Web 工程的 WEB-INF/lib 目录下。

    💦 操作

    在 pro02-maven-web 工程的 pom.xml 中,找到 dependencies 标签,在 dependencies 标签中做如下配置:

    
    
    <dependency>
      <groupId>com.atguigu.mavengroupId>
      <artifactId>pro01-maven-javaartifactId>
      <version>1.0-SNAPSHOTversion>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    💦 在 Web 工程中,编写测试代码

    证明在Web工程中可以使用Java工程中创建的那个类:Calculator

    💧 补充创建目录

    pro02-maven-web\src\test\java\com\atguigu\maven

    可以使用mkdir命令:

    mkdir src\test\java\com\atguigu\maven
    
    • 1
    💧 确认 Web 工程依赖了 junit
        <dependency>
          <groupId>junitgroupId>
          <artifactId>junitartifactId>
          <version>4.12version>
          <scope>testscope>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    💧 创建测试类

    把 Java 工程的 CalculatorTest.java 类复制到 pro02-maven-wb\src\test\java\com\atguigu\maven 目录下

    在这里插入图片描述

    💦 执行Maven命令
    💧 测试命令

    mvn test

    说明:测试操作中会提前自动执行编译操作,测试成功就说明编译也是成功的。

    在这里插入图片描述

    💧 打包命令

    mvn package

    通过查看 war 包内的结构,我们看到被 Web 工程依赖的 Java 工程确实是会变成 Web 工程的 WEB-INF/lib 目录下的 jar 包。

    在这里插入图片描述
    在这里插入图片描述

    💧 查看当前 Web 工程所依赖的 jar 包的列表

    mvn dependency:list

    [INFO] The following files have been resolved:
    [INFO] org.hamcrest:hamcrest-core:jar:1.3:test
    [INFO] javax.servlet:javax.servlet-api:jar:3.1.0:provided
    [INFO] com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
    [INFO] junit:junit:jar:4.12:test
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    说明:javax.servlet:javax.servlet-api:jar:3.1.0:provided 格式显示的是一个 jar 包的坐标信息。格式是:

    groupId:artifactId:打包方式:version:依赖的范围

    这样的格式虽然和我们 XML 配置文件中坐标的格式不同,但是本质上还是坐标信息,大家需要能够认识这样的格式,将来从 Maven 命令的日志或错误信息中看到这样格式的信息,就能够识别出来这是坐标。进而根据坐标到Maven 仓库找到对应的jar包,用这样的方式解决我们遇到的报错的情况。

    💧 以树形结构查看当前 Web 工程的依赖信息

    mvn dependency:tree

    [INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT
    [INFO] +- junit:junit:jar:4.12:test
    [INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
    [INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
    [INFO] \- com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    我们在 pom.xml 中并没有依赖 hamcrest-core,但是它却被加入了我们依赖的列表。原因是:junit 依赖了hamcrest-core,然后基于依赖的传递性,hamcrest-core 被传递到我们的工程了。

    🌊 测试依赖范围

    💦 依赖范围

    标签的位置:dependencies/dependency/scope

    标签的可选值:compile/test/provided/system/runtime/import

    compile为默认值

    💧 compile 和 test 对比
    main目录(空间)test目录(空间)开发过程(时间)部署到服务器(时间)
    compile有效有效有效有效
    test无效有效有效无效
    💧 compile 和 provided 对比
    main目录(空间)test目录(空间)开发过程(时间)部署到服务器(时间)
    compile有效有效有效有效
    provided有效有效有效无效

    provided 已提供的,项目部署到服务器,服务器中已经提供了的jar包,就不需要进行额外的打包到服务器

    💧 结论

    compile:通常使用的第三方框架的 jar 包这样在项目实际运行时真正要用到的 jar 包都是以 compile 范围进行依赖的。比如 SSM 框架所需jar包。

    test:测试过程中使用的 jar 包,以 test 范围依赖进来。比如 junit。

    provided:在开发过程中需要用到的“服务器上的 jar 包”通常以 provided 范围依赖进来。比如 servlet-api、jsp-api。而这个范围的 jar 包之所以不参与部署、不放进 war 包,就是避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担。说白了就是:“服务器上已经有了,你就别带啦!”

    🌊 测试依赖的传递性

    💦 依赖的传递性
    💧 概念

    A 依赖 B,B 依赖 C,那么在 A 没有配置对 C 的依赖的情况下,A 里面能不能直接使用 C?

    💧 传递的原则

    在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。

    • B 依赖 C 时使用 compile 范围:可以传递
    • B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。

    工程依赖的jar包是从Maven仓库中查找到相应的jar包然后进行导入的,所以需要引入自己创建的jar包时,需要及时把最新版本的jar更新到本地仓库中。

    🌊 测试依赖的排除

    💦 概念

    当 A 依赖 B,B 依赖 C 而且 C 可以传递到 A 的时候,A 不想要 C,需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免 jar 包之间的冲突。

    所以配置依赖的排除其实就是阻止某些 jar 包的传递。因为这样的 jar 包传递过来会和其他 jar 包冲突。

    💦 配置方式
    <dependency>
      <groupId>com.atguigu.mavengroupId>
      <artifactId>pro01-maven-javaartifactId>
      <version>1.0-SNAPSHOTversion>
      <scope>compilescope>
      
      
      <exclusions>
        
        <exclusion>
          
          
          <groupId>commons-logginggroupId>
          <artifactId>commons-loggingartifactId>
        exclusion>
      exclusions>
    dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    🌊 继承

    💦 概念

    Maven工程之间,A 工程继承 B 工程

    • B 工程:父工程
    • A 工程:子工程

    本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置。

    💦 作用

    在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。

    它的背景是:

    • 对一个比较大型的项目进行了模块拆分。
    • 一个 project 下面,创建了很多个 module。
    • 每一个 module 都需要配置自己的依赖信息。

    它背后的需求是:

    • 在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。
    • 使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。
    • 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。

    通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。

    💦 举例

    在一个工程中依赖多个 Spring 的 jar 包

    [INFO] +- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
    [INFO] | \- commons-logging:commons-logging:jar:1.1.1:compile
    [INFO] +- org.springframework:spring-beans:jar:4.0.0.RELEASE:compile
    [INFO] +- org.springframework:spring-context:jar:4.0.0.RELEASE:compile
    [INFO] +- org.springframework:spring-expression:jar:4.0.0.RELEASE:compile
    [INFO] +- org.springframework:spring-aop:jar:4.0.0.RELEASE:compile
    [INFO] | \- aopalliance:aopalliance:jar:1.0:compile
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    使用 Spring 时要求所有 Spring 自己的 jar 包版本必须一致。为了能够对这些 jar 包的版本进行统一管理,我们使用继承这个机制,将所有版本信息统一在父工程中进行管理。

    💦 操作
    💧 创建父工程

    创建的过程和前面创建 pro01-maven-java 一样。

    工程名称:pro03-maven-parent

    工程创建好之后,要修改它的打包方式:

      <groupId>com.atguigu.mavengroupId>
      <artifactId>pro03-maven-parentartifactId>
      <version>1.0-SNAPSHOTversion>
    
      
      <packaging>pompackaging>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    只有打包方式为 pom 的 Maven 工程能够管理其他 Maven 工程。打包方式为 pom 的 Maven 工程中不写业务代码,它是专门管理其他 Maven 工程的工程。

    💧 创建模块工程(子工程)

    模块工程类似于 IDEA 中的 module,所以需要进入 pro03-maven-parent 工程的根目录,然后运行 mvn archetype:generate 命令来创建模块工程。

    假设,我们创建三个模块工程:

    在这里插入图片描述

    💧 查看被添加新内容的父工程 pom.xml

    下面 modules 和 module 标签是聚合功能的配置,Maven自动配置

    <modules>  
      <module>pro04-maven-modulemodule>
      <module>pro05-maven-modulemodule>
      <module>pro06-maven-modulemodule>
    modules>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    💧 解读子工程的pom.xml
    
    <parent>
      
      <groupId>com.atguigu.mavengroupId>
      <artifactId>pro03-maven-parentartifactId>
      <version>1.0-SNAPSHOTversion>
    parent>
    
    
    
    
    <artifactId>pro04-maven-moduleartifactId>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    💧 在父工程中配置依赖的统一管理
    
    
    
    
    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-coreartifactId>
          <version>4.0.0.RELEASEversion>
        dependency>
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-beansartifactId>
          <version>4.0.0.RELEASEversion>
        dependency>
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-contextartifactId>
          <version>4.0.0.RELEASEversion>
        dependency>
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-expressionartifactId>
          <version>4.0.0.RELEASEversion>
        dependency>
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-aopartifactId>
          <version>4.0.0.RELEASEversion>
        dependency>
      dependencies>
    dependencyManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    💧 子工程中引用那些被父工程管理的依赖

    关键点:省略版本号

    
    
    
    
    <dependencies>
      <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-coreartifactId>
      dependency>
      <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-beansartifactId>
      dependency>
      <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-contextartifactId>
      dependency>
      <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-expressionartifactId>
      dependency>
      <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-aopartifactId>
      dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    💧 在父工程中升级依赖信息的版本
    ……
          <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-beansartifactId>
            <version>4.1.4.RELEASEversion>
          dependency>
    ……
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后在子工程中运行mvn dependency:list,效果如下:

    [INFO] org.springframework:spring-aop:jar:4.1.4.RELEASE:compile  
    [INFO] org.springframework:spring-core:jar:4.1.4.RELEASE:compile  
    [INFO] org.springframework:spring-context:jar:4.1.4.RELEASE:compile  
    [INFO] org.springframework:spring-beans:jar:4.1.4.RELEASE:compile  
    [INFO] org.springframework:spring-expression:jar:4.1.4.RELEASE:compile
    
    • 1
    • 2
    • 3
    • 4
    • 5
    💧 在父工程中声明自定义属性
    
    <properties>
      <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
      
      
      <atguigu.spring.version>4.3.6.RELEASEatguigu.spring.version>
    properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在需要的地方使用${}的形式来引用自定义的属性名:

          <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-coreartifactId>
            <version>${atguigu.spring.version}version>
          dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    真正实现“一处修改,处处生效”。

    💦 实际意义

    编写一套符合要求、开发各种功能都能正常工作的依赖组合并不容易。如果公司里已经有人总结了成熟的组合方案,那么再开发新项目时,如果不使用原有的积累,而是重新摸索,会浪费大量的时间。为了提高效率,我们可以使用工程继承的机制,让成熟的依赖组合方案能够保留下来。

    如上图所示,公司级的父工程中管理的就是成熟的依赖组合方案,各个新项目、子系统各取所需即可。

    🌊 聚合

    💦 Maven 中的聚合

    使用一个“总工程”将各个“模块工程”汇集起来,作为一个整体对应完整的项目。

    • 项目:整体
    • 模块:部分

    概念的对应关系:
    从继承关系角度来看:
    ●父工程
    ●子工程
    从聚合关系角度来看:
    ●总工程
    ●模块工程

    💦 好处
    • 一键执行 Maven 命令:很多构建命令都可以在“总工程”中一键执行。

      以 mvn install 命令为例:Maven 要求有父工程时先安装父工程;有依赖的工程时,先安装被依赖的工程。我们自己考虑这些规则会很麻烦。但是工程聚合之后,在总工程执行 mvn install 可以一键完成安装,而且会自动按照正确的顺序执行。

    • 配置聚合之后,各个模块工程会在总工程中展示一个列表,让项目中的各个模块一目了然。

    💦 聚合的配置

    在总工程中配置 modules 即可:

        
        pro04-maven-module
        pro05-maven-module
        pro06-maven-module
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    💦 依赖循环问题

    如果 A 工程依赖 B 工程,B 工程依赖 C 工程,C 工程又反过来依赖 A 工程,那么在执行构建操作时会报下面的错误:

    [ERROR] [ERROR] The projects in the reactor contain a cyclic reference:

    这个错误的含义是:循环引用。

    🥽 使用Maven:IDEA

    在这里插入图片描述

    🌊 创建父工程

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    🌊 开启自动导入

    创建 Project 后,IDEA 会自动弹出下面提示,我们选择『Enable Auto-Import』,意思是启用自动导入。

    在这里插入图片描述

    这个自动导入一定要开启,因为 Project、Module 新创建或 pom.xml 每次修改时都应该让 IDEA 重新加载 Maven 信息。这对 Maven 目录结构认定、Java 源程序编译、依赖 jar 包的导入都有非常关键的影响。

    另外也可以通过 IDEA 的 Settings 设置来开启:
    在这里插入图片描述

    🌊 配置 Maven 信息

    每次创建 Project 后都需要设置 Maven 家目录位置,否则 IDEA 将使用内置的 Maven 核心程序(不稳定)并使用默认的本地仓库位置。这样一来,我们在命令行操作过程中已下载好的 jar 包就白下载了,默认的本地仓库通常在 C 盘,还影响系统运行。

    配置之后,IDEA 会根据我们在这里指定的 Maven 家目录自动识别到我们在 settings.xml 配置文件中指定的本地仓库。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    🌊 创建 Java 模块工程

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    🌊 执行Maven命令

    💦 方式一

    在这里插入图片描述

    💦 方式二

    在这里插入图片描述
    在这里插入图片描述

    如果有需要,还可以给命令后面附加参数:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yuVORsLf-1675015871747)(https://secure2.wostatic.cn/static/uBPUiQA7kXvw9XVhtXbQKi/image.png?auth_key=1675015783-vU67ZAgwHEG53361JwxsfR-0-a66b8c9388fa4dc058345c4e4665075b)]

    # -D 表示后面要附加命令的参数,字母 D 和后面的参数是紧挨着的,中间没有任何其它字符
    # maven.test.skip=true 表示在执行命令的过程中跳过测试
    mvn clean install -Dmaven.test.skip=true
    
    • 1
    • 2
    • 3
    💦 方式三

    在这里插入图片描述
    在这里插入图片描述

    🌊 创建 Web 模块工程

    💦 创建模块

    在这里插入图片描述
    在这里插入图片描述

    💦 修改打包方式

    Web 模块将来打包当然应该是 war 包。

    <packaging>warpackaging>
    
    • 1
    💦 Web 设定

    首先打开项目结构菜单:

    在这里插入图片描述

    然后到 Facets 下查看 IDEA 是否已经帮我们自动生成了 Web 设定。正常来说只要我们确实设置了打包方式为 war,那么 IDEA 就会自动生成 Web 设定。

    在这里插入图片描述

    另外,对于 IDEA 2018 诸版本没有自动生成 Web 设定,那么请参照下面两图,我们自己创建:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nKQei0il-1675016696911)(https://secure2.wostatic.cn/static/dMzQz2zAdjLWTXsDLq9eiQ/image.png?auth_key=1675015302-qWZLRhFqgEmnHraL9bgn8X-0-35bf8b1e4437c65ace407ade30ea5e16)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUYrol4U-1675016696913)(https://secure2.wostatic.cn/static/i8kbSod8MyiSKbhLUFZeZm/image.png?auth_key=1675015302-gFokeVWNdCMXAQ2PMkT453-0-987cef93dffcc81dfb96f27512ba0726)]

    💦 借助IDEA生成web.xml

    在这里插入图片描述
    在这里插入图片描述

    💦 设置 Web 资源的根目录

    结合 Maven 的目录结构,Web 资源的根目录需要设置为 src/main/webapp 目录。

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    🌊 工程导入

    Maven工程除了自己创建的,还有很多情况是别人创建的。而为了参与开发或者是参考学习,我们都需要导入到 IDEA 中。下面我们分几种不同情况来说明:

    💦 来自版本控制系统

    目前我们通常使用的都是 Git(本地库) + 码云(远程库)的版本控制系统,结合 IDEA 的相关操作方式请点这里 (opens new window)查看克隆远程库部分。

    💦 来自工程目录

    直接使用 IDEA 打开工程目录即可。下面咱们举个例子:

    💧 工程压缩包

    假设别人发给我们一个 Maven 工程的 zip 压缩包:maven-rest-demo.zip。从码云或GitHub上也可以以 ZIP 压缩格式对项目代码打包下载。

    💧 解压

    如果你的所有 IDEA 工程有一个专门的目录来存放,而不是散落各处,那么首先我们就把 ZIP 包解压到这个指定目录中。

    💧 打开

    只要我们确认在解压目录下可以直接看到 pom.xml,那就能证明这个解压目录就是我们的工程目录。那么接下来让 IDEA 打开这个目录就可以了。

    在这里插入图片描述

    💧 设置 Maven 核心程序位置

    打开一个新的 Maven 工程,和新创建一个 Maven 工程是一样的,此时 IDEA 的 settings 配置中关于 Maven 仍然是默认值:

    所以我们还是需要像新建 Maven 工程那样,指定一下 Maven 核心程序位置:

    🌊 模块导入

    💦 情景重现

    在实际开发中,通常会忽略模块(也就是module)所在的项目(也就是project)仅仅导入某一个模块本身。这么做很可能是类似这样的情况:比如基于 Maven 学习 SSM 的时候,做练习需要导入老师发给我们的代码参考。

    💦 导入 Java 类型模块
    💧 找到老师发的工程目录

    在这里插入图片描述

    💧 复制我们想要导入的模块目录

    在这里插入图片描述

    💧 粘贴到我们自己工程目录下

    这个工程(project)是我们事先在 IDEA 中创建好的。


    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qRHgCmhp-1675017561559)(https://secure2.wostatic.cn/static/amfjRUszUSDQ9QscDUwLe1/nQFvBoaYSZKK3D32tmoztx.png?auth_key=1675015784-xAAbBSVXAkDBYWFNxP5Yc3-0-85e9cecf9605275743c7b1b3edadf198)]

    💧 在 IDEA 中执行导入

    在这里插入图片描述





    💧 修改 pom.xml

    刚刚导入的 module 的父工程坐标还是以前的,需要改成我们自己的 project。


    💧 最终效果

    💦 导入 Web 类型模块

    其它操作和上面演示的都一样,只是多一步:删除多余的、不正确的 web.xml 设置。如下图所示:

    🥽 其他核心概念

    🌊 生命周期

    💦 作用

    为了让构建过程自动化完成,Maven 设定了三个生命周期,生命周期中的每一个环节对应构建过程中的一个操作。

    💦 三个生命周期
    生命周期名称作用各个环节
    Clean清理操作相关pre-clean
    clean
    post-clean
    Site生成站点相关pre-site
    site
    post-site
    deploy-site
    Default主要构建过程validate 检查
    generate-sources
    process-sources 源码
    generate-resources 配置文件
    process-resources 复制并处理资源文件,至目标目录,准备打包。
    compile 编译项目 main 目录下的源代码。
    process-classes
    generate-test-sources
    process-test-sources
    generate-test-resources
    process-test-resources 复制并处理资源文件,至目标测试目录。
    test-compile 编译测试源代码。
    process-test-classes
    test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
    prepare-package
    package 接受编译好的代码,打包成可发布的格式,如JAR。
    pre-integration-test
    integration-test
    post-integration-test
    verify
    install将包安装至本地仓库,以让其它项目依赖。
    deploy将最终的包复制到远程的仓库,以让其它开发人员共享;或者部署到服务器上运行(需借助插件,例如:cargo)。
    💦 特点
    • 前面三个生命周期彼此是独立的。
    • 在任何一个生命周期内部,执行任何一个具体环节的操作,都是从本周期最初的位置开始执行,直到指定的地方。(本节记住这句话就行了,其他的都不需要记)

    Maven 之所以这么设计其实就是为了提高构建过程的自动化程度:让使用者只关心最终要干的即可,过程中的各个环节是自动执行的。

    🌊 插件和目标

    💦 插件

    Maven 的核心程序仅仅负责宏观调度,不做具体工作。具体工作都是由 Maven 插件完成的。例如:编译就是由 maven-compiler-plugin-3.1.jar 插件来执行的。

    💦 目标

    一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应。 (目标其实是插件的功能)

    Default 生命周期中有 compile 和 test-compile 两个和编译相关的环节,这两个环节对应 compile 和 test-compile 两个目标,而这两个目标都是由 maven-compiler-plugin-3.1.jar 插件来执行的。

    🌊 仓库

    • 本地仓库:在当前电脑上,为电脑上所有 Maven 工程服务
    • 远程仓库:需要联网
      • 局域网:我们自己搭建的 Maven 私服,例如使用 Nexus 技术。
      • Internet
        • 中央仓库
        • 镜像仓库:内容和中央仓库保持一致,但是能够分担中央仓库的负载,同时让用户能够就近访问提高下载速度,例如:Nexus aliyun

    建议:不要中央仓库和阿里云镜像混用,否则 jar 包来源不纯,彼此冲突。

    专门搜索 Maven 依赖信息的网站:https://mvnrepository.com/

  • 相关阅读:
    多线程环境下事务与锁的问题
    MyBatis Like 拼接
    #力扣:2413. 最小偶倍数@FDDLC
    电脑msvcp140丢失报错解决方法,msvcp140.dll重新安装的解决方法
    【Nacos】源码之服务端服务注册
    Docker Compose
    请解释Java中的策略模式,并举例说明其应用场景和实现方式。请解释Java中的模板方法模式,并讨论其在实际项目中的应用。
    HTML5响应式网站模板源码 自助建站平台系统源码 可视化后台+700多套模板+安装部署教程
    Flink Operator 使用指南 之 Flink Operator安装
    ElasticSearch学习
  • 原文地址:https://blog.csdn.net/weixin_46225503/article/details/134525151