• 2022-03-02-Maven



    layout: post
    #标题配置
    title: Maven
    #时间配置
    date: 2022-03-02 21:17:00 +0800
    #目录配置
    categories: maven
    #标签配置
    tag: 学习笔记

    • content
      {:toc}

    一.Maven基础

    学习目标

    目标1:能够说出maven的作用,POM的概念

    目标2:完成maven的下载,安装和环境配置

    目标3:能够说出仓库,坐标的概念,完成仓库的配置

    目标4:完成手动搭建maven项目的案例

    目标5:完成IDEA工具搭建maven项目的案例

    目标6:能够说出依赖的传递方式和如何解决依赖传递冲突

    目标7:能够说出maven的生命周期

    1.Maven简介

    1.1 Maven是什么

    在学习Maven之前,我们先来看一下我们现在做的项目都有哪些问题。假设你现在做了一个crm的系统,项目中肯定要用到一些jar包,比如说mybatis,log4j,JUnit等,除了这些之外,你有可能用到你的同事开发的其他的东西,比如说别人做了一个财务模块或做了一个结算的模块,你在这里边有可能要用到这些东西。

    • jar包不统一,jar包不兼容
    • 工程升级维护过程操作繁琐

    假如有一天你们的项目中mybatis进行了一个升级,但是它内部使用的JUnit没有升级,你升级以后的mybatis假如要用5.0的JUnit,而你项目中目前用的是4.0的,会不会冲突?必然会出问题!这个时候管理起来会比较麻烦,你需要各种调整。更有甚者,假如同事做的这些东西升级了但又没有通知你,这个时候,就会出现几种严重的问题:

    (1)jar包不统一,jar不兼容

    (2)工程升级维护过程操作繁琐

    除此之外,还会有其它的一系列问题。那么要解决这些问题,就用到了我们今天要讲的Maven了。

    Maven是什么

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

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

    1

    我们说一个项目就是一个对象,作为对象的行为、对象的属性都有哪些呢?

    Maven说我们需要编写一个pom.xml文件,Maven通过加载这个配置文件就可以知道我们项目的相关信息了!到这里我们知道了Maven离不开一个叫pom.xml的文件。因为这个文件代表就一个项目。

    提个问题大家思考,如果我们做8个项目,对应的是1个文件,还是8个文件?肯定是8个!

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

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

    那maven的依赖管理它管理的这些资源存在哪儿呢?主要有三个位置:本地仓库,私服,中央仓库

    本地仓库顾名思义就是存储在本地的一种资源仓库,如果本地仓库中没有相关资源,可以去私服上获取,私服也是一个资源仓库,只不过不在本地,是一种远程仓库,如果私服上也没有相关资源,可以去中央仓库去获取,中央仓库也是一种远程仓库。

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

    1.2 Maven的作用

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

    (1)项目构建:提供标准的,跨平台的自动化构建项目的方式

    (2)依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突等问题

    (3)统一开发结构:提供标准的,统一的项目开发结构,如下图所示:

    mm
     -src
       -main
         -java
         -resources
         -webapp
       -test
         -java
         -resources
     -mm.iml
     -pom.xml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    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.6.1-bin.zip直接解压到D盘根目录下即可

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

    -bin
    -boot
    -conf
    -lib
    -LICENSE
    -NOTICE
    -README.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    各目录结构说明:

    bin:可执行程序目录,

    boot:maven自身的启动加载器

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

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

    2.3 环境配置

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

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

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

    系统变量值就是maven软件的根目录

    1:我的电脑-------->属性--------->高级系统设置---------->Path---------->%MAVEN_HOME%\bin

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

    mvn -v
    
    • 1

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

    3.Maven基础概念

    3.1 仓库

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

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

    中央仓库:maven团队自身维护的仓库,属于开源的

    私服:各公司/部门等小范围内存储资源的仓库,私服也可以从中央仓库获取资源

    本地仓库:开发者自己电脑上存储资源的仓库,也可从远程仓库获取资源

    私服的作用:

    (1)保存具有版权的资源,包含购买或自主研发的jar

    (2)一定范围内共享资源,能做到仅对内不对外开放

    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中可以找到它的说明

      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

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

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

      
    <localRepository>D:\maven-repositorylocalRepository>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    注意:局部用户配置优先与全局配置(遇见相同配置项的时候)

    全局setting与用户setting区别

    • 全局settting定义了当前计算机中Maven的公共配置
    • 用户settting定义了当前用户的配置

    另外大家需要注意:maven默认连接的远程仓库位置是:(即中央仓库)

    <repositories>
    	<repository>
    		<id>centralid>
    		<name>Central Repository
    		<url>https://repo.maven. apache.org/maven2url>
            <layout>default
    		<snapshots>
    			<enabled>false
            snapshots>
    	repository>
    repositories>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    此站点并不在国内,因此有时候下载速度非常慢,因此我们可以配置一个国内站点镜像,可用于加速下载资源

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

    <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

    4.Maven项目搭建

    我们回顾一下maven规范的目录结构:

    java-project
     -src
       -main
         -java
         -resources
         -webapp
       -test
         -java
         -resources
     -java-project.iml
     -pom.xml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    package com.itheima;
    
    public class Demo{
    	public String say(String name){
    		System.out.println("hello "+name);
    		return "hello "+name;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    package com.itheima;
    
    import org.junit.*;
    public class DemoTest{
    	
    	@Test
    	public void testSay(){
    		Demo d = new Demo();
    		String ret = d.say("maven");
    		Assert.assertEquals("hello maven",ret);
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (9)在project-java/src下创建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/maven-v4_0_0.xsd">
    
        <modelVersion>4.0.0modelVersion>
    
        <groupId>com.itheimagroupId>
        <artifactId>project-javaartifactId>
        <version>1.0version>
        <packaging>jarpackaging>
    
        <dependencies>
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.12version>
            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

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

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

    mvn compile:编译

    mvn clean:清理

    mvn test:测试

    mvn package:打包

    mvn install:安装到本地仓库

    下面我们来进行操作:

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

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

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

    • 其中生成的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本身就给我们提供了相关的插件来帮助我们快速构建项目,当然这是一些命令:

    • 创建工程

      mvn archetype:generate
      	-DgroupId={project-packaging}
      	-DartifactId={project-name}
      	-DarchetypeArtifactId=maven-archetype-quickstart
      	-DinteractiveMode=false
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 创建java工程

      mvn archetype:generate -DgroupId=com.wzk -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false
      
      • 1
    • 创建web工程

      mvn archetype:generate -DgroupId=com.wzk -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false
      
      • 1

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

    4.2 IDEA工具搭建maven项目

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

    需要注意的是:Maven和IDEA在版本上存在一些兼容性问题,因为要合理的选择Maven和IDEA的版本,本课程中提供安装maven-3.6.1版本是可用的

    4.2.1 不使用原型创建项目

    (1)在IDEA中配置Maven

    (2)创建maven工程

    (3)填写本项目的坐标

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

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

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

    <dependencies>
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version>
        dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    package com.itheima;
    
    /**
     * Created by 传智播客*黑马程序员.
     */
    public class Demo{
        public String say(String name){
            System.out.println("hello "+name);
            return "hello "+name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    package com.itheima;
    
    import org.junit.Assert;
    import org.junit.Test;
    
    /**
     * Created by 传智播客*黑马程序员.
     */
    public class DemoTest{
    
        @Test
        public void testSay(){
            Demo d = new Demo();
            String ret = d.say("maven");
            Assert.assertEquals("hello maven",ret);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 然后可以进行测试运行

    • 运行的时候可以编辑运行模板

    • 然后点击运行

    4.2.2 使用原型创建项目

    • 首先我们来看普通的java工程如何创建:

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

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

    我们需要手动去补全目录,并且要对补全的目录进行标记,切记

    • 然后我们在来看web工程如何创建:

    (1)选择web对应的原型骨架

    有很多的webapp原型骨架,选择哪个基本都差不多,包括前面创建普通项目也是一样,quickstart原型也有很多

    (2)和前面创建普通项目一样,通过原型创建web项目得到的目录结构是不全的,因此需要我们自行补全,同时要标记正确

    (3)web工程创建好之后需要启动运行,需要使用一个tomcat插件来运行我们的项目,在pom.xml中添加插件的坐标即可,最终改好的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/maven-v4_0_0.xsd">
        
        <modelVersion>4.0.0modelVersion>
        
        <packaging>warpackaging>
    
        
        <groupId>com.wzkgroupId>
        
        <artifactId>web01artifactId>
        
        <version>1.0-SNAPSHOTversion>
    
        
        <dependencies>
            
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.12version>
                <scope>testscope>
            dependency>
        dependencies>
    
        
        <build>
            
            <plugins>
                
                <plugin>
                    <groupId>org.apache.tomcat.mavengroupId>
                    <artifactId>tomcat7-maven-pluginartifactId>
                    <version>2.1version>
                    <configuration>
                        <port>80port>
                        <path>/path>
                    configuration>
                plugin>
            plugins>
        build>
    
    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

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

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

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

    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.mavengroupId>
            <artifactId>tomcat7-maven-pluginartifactId>
            <version>2.1version>
            <configuration>
                <port>80port>
            configuration>
        plugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    • AddConfigurations

    5.Maven依赖管理

    5.1 依赖配置与依赖传递

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

    
    <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

    依赖传递:

    依赖具有传递性,分两种

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

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

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

    依赖传递的冲突问题:

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

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

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

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

    可选依赖(可选依赖指对外隐藏当前所依赖的资源――不透明)

    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.12version>
      <optional>trueoptional>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    排除依赖:(排除依赖指主动断开依赖的资源,被排除的资源无需指定版本――不需要)

    <dependency>
      <groupId>com.wzkgroupId>
      <artifactId>project03artifactId>
      <version>1.0-SNAPSHOTversion>
      <exclusions>
        <exclusion>
          <groupId>log4jgroupId>
          <artifactId>log4jartifactId>
        exclusion>
      exclusions>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5.2 依赖范围

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

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

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

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

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

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

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

    scope主代码测试代码打包范例
    compile(默认)YYYlog4j
    testYjunit
    providedYYservlet-api
    runtimeYjdbc

    依赖范围的传递性:

    • 带有依赖范围的资源在进行传递时,作用范围将受到影响

    • 如下图,第一排为直接依赖,第一列为间接依赖

      compiletestprovidedruntime
      compilecompiletestprovidedruntime
      test
      provided
      runtimeruntimetestprovidedruntime

    6.Maven生命周期与插件

    6.1 生命周期

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

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

    compile->test-compile->test->package->instasll
    
    • 1

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

    (1)clean:清理工作

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

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

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

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

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

    validate(校验)                    校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
    initialize(初始化)                初始化构建状态,比如设置属性值。
    generate-sources(生成源代码)       生成包含在编译阶段中的任何源代码。
    process-sources(处理源代码)        处理源代码,比如说,过滤任意值。
    generate-resources(生成资源文件)   生成将会包含在项目包中的资源文件。
    process-resources(处理资源文件)    复制和处理资源到目标目录,为打包阶段最好准备。
    *compile(编译) *                  编译项目的源代码。
    process-classes(处理类文件)        处理编译生成的文件,比如说对Java class文件做字节码改善优化。
    generate-test-sources(生成测试源代码)          生成包含在编译阶段中的任何测试源代码。
    process-test-sources(处理测试源代码)           处理测试源代码,比如说,过滤任意值。
    generate-test-resources (生成测试资源文件)     为测试创建资源文件。
    process-test-resources (处理测试资源文件)      复制和处理测试资源到目标目录。
    *test-compile(编译测试源码)*                   编译测试源代码到测试目标目录.
    process-test-classes (处理测试类文件)          处理测试源码编译生成的文件。
    *test(测试)*                      使用合适的单元测试框架运行测试(Juint是其中之一)。
    prepare-package (准备打包)         在实际打包之前,执行任何的必要的操作为打包做准备。
    *package (打包) *               将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
    pre-integration-test(集成测试前)        在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
    integration-test(集成测试)              处理和部署项目到可以运行集成测试环境中
    post-integration-test(集成测试后)  在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。
    verify(验证)                           运行任意的检查来验证项目包有效且达到质量标准。
    install(安装)               安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
    deploy (部署)               将最终的项目包复制到远程仓库中与其他开发者和项目共享。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

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

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

    site:生成项目的站点文档

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

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

    6.2 插件

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

    插件:

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

    插件的配置方式如下:

    <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-source-pluginartifactId>
            <version>2.2.1version>
            <executions>
              <execution>
                <goals>
                  <goal>jargoal>
                goals>
                <phase>generate-test-resourcesphase>
              execution>
            executions>
          plugin>
        plugins>
      build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

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

    二.Maven高级

    1.分模块开发与设计

    1.1 工程模块与模块划分

    2

    1.2 ssm_pojo拆分

    新建模块

    拷贝原始项目中对应的相关内容到ssm_pojo模块中

    ​ 实体类(User)

    ​ 配置文件(无)

    1.3 ssm_dao拆分

    • 新建模块

    • 拷贝原始项目中对应的相关内容到ssm_dao模块中

      • 数据层接口(UserDao)

      • 配置文件:保留与数据层相关配置文件(3个)

      • 注意:分页插件在配置中与SqlSessionFactoryBean绑定,需要保留

      • pom.xml:引入数据层相关坐标即可,删除springmvc相关坐标

        • spring

        • mybatis

        • spring 整合mybatis

        • mysql

        • druid

        • pagehelper

        • 直接依赖ssm_pojo(对ssm_pojo模块执行install指令,将其安装到本地仓库)

    1.4 ssm_service拆分

    • 新建模块

    • 拷贝原始项目中对应的相关内容到ssm_service模块中

      • 业务层接口与实现类(UserService、UserServiceImpl)

      • 配置文件:保留与数据层相关配置文件(1个)

      • pom.xml:引入数据层相关坐标即可,删除springmvc相关坐标

        • spring

        • junit

        • spring 整合junit

        • 直接依赖ssm_dao(对ssm_dao模块执行install指令,将其安装到本地仓库)

        • 间接依赖ssm_pojo(由ssm_dao模块负责依赖关系的建立)

      • 修改service模块spring核心配置文件名,添加模块名称,格式:applicationContext-service.xml

      • 修改dao模块spring核心配置文件名,添加模块名称,格式:applicationContext-dao.xml

      • 修改单元测试引入的配置文件名称,由单个文件修改为多个文件

    1.5 ssm_control拆分

    • 新建模块(使用webapp模板)

    • 拷贝原始项目中对应的相关内容到ssm_controller模块中

      • 现层控制器类与相关设置类(UserController、异常相关……)

      • 配置文件:保留与表现层相关配置文件(1个)、服务器相关配置文件(1个)

      • pom.xml:引入数据层相关坐标即可,删除springmvc相关坐标

        • spring

        • springmvc

        • jackson

        • servlet

        • tomcat服务器插件

        • 直接依赖ssm_service(对ssm_service模块执行install指令,将其安装到本地仓库)

        • 间接依赖ssm_dao、ssm_pojo

      • 修改web.xml配置文件中加载spring环境的配置文件名称,使用*通配,加载所有applicationContext-开始的配置文件

    小节

    分模块开发

    • 模块中仅包含当前模块对应的功能类与配置文件

    • spring核心配置根据模块功能不同进行独立制作

    • 当前模块所依赖的模块通过导入坐标的形式加入当前模块后才可以使用

    • web.xml需要加载所有的spring核心配置文件

    2.聚合

    2.1 多模块构建维护

    3

    2.2 聚合

    • 作用:聚合用于快速构建maven工程,一次性构建多个项目/模块。

    • 制作方式:

      • 创建一个空模块,打包类型定义为pom

        <packaging>pompackaging>
        
        • 1
      • 定义当前模块进行构建操作时关联的其他模块名称

        <modules>
            <module>../ssm_controllermodule>
            <module>../ssm_servicemodule>
            <module>../ssm_daomodule>
            <module>../ssm_pojomodule>
        modules>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6

    注意事项:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关

    3.继承

    3.1 模块依赖关系维护

    4

    3.2 继承

    • 作用:通过继承可以实现在子工程中沿用父工程中的配置

      • maven中的继承与java中的继承相似,在子工程中配置继承关系
    • 制作方式:

      • 在子工程中声明其父工程坐标与对应的位置

        
        <parent>
            <groupId>com.itheimagroupId>
            <artifactId>ssmartifactId>
            <version>1.0-SNAPSHOTversion>
            
            <relativePath>../ssm/pom.xmlrelativePath>
        parent>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8

    3.3 继承依赖定义

    在父工程中定义依赖管理

    
    <dependencyManagement>
        
        <dependencies>
            
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-contextartifactId>
                <version>5.1.9.RELEASEversion>
            dependency>
        <dependencies>
    <dependencyManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.4 继承依赖使用

    在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本

    <dependencies>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
        dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.5 继承的资源

    groupId:项目组ID,项目坐标的核心元素

    version:项目版本,项目坐标的核心因素

    description:项目的描述信息

    organization:项目的组织信息

    inceptionYear:项目的创始年份

    url:项目的URL地址

    developers:项目的开发者信息

    contributors:项目的贡献者信息

    distributionManagement:项目的部署配置

    issueManagement:项目的缺陷跟踪系统信息

    ciManagement:项目的持续集成系统信息

    scm:项目的版本控制系统西溪

    malilingLists:项目的邮件列表信息

    properties:自定义的Maven属性

    dependencies:项目的依赖配置

    dependencyManagement:项目的依赖管理配置

    repositories:项目的仓库配置

    build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等

    reporting:包括项目的报告输出目录配置、报告插件配置等

    3.6 继承与聚合

    作用

    • 聚合用于快速构建项目

    • 继承用于快速配置

    相同点:

    • 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中

    • 聚合与继承均属于设计型模块,并无实际的模块内容

    不同点:

    • 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些

    • 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己

    4.属性

    4.1 版本统一的重要性

    5

    4.2 属性类别

    1.自定义属性

    2.内置属性

    3.Setting属性

    4.Java系统属性

    5.环境变量属性

    4.3 属性类别:自定义属性

    作用

    • 等同于定义变量,方便统一维护

    定义格式:

    
    <properties>
        <spring.version>5.1.9.RELEASEspring.version>
        <junit.version>4.12junit.version>
    properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中

    • 聚合与继承均属于设计型模块,并无实际的模块内容

    调用格式:

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

    4.4 属性类别:内置属性

    作用

    • 使用maven内置属性,快速配置

    调用格式:

    ${basedir}
    ${version}
    
    • 1
    • 2

    4.5 属性类别:Setting属性

    作用

    • 使用Maven配置文件setting.xml中的标签属性,用于动态配置

    调用格式:

    ${settings.localRepository} 
    
    • 1

    4.6 属性类别:Java系统属性

    作用

    • 读取Java系统属性

    调用格式

    ${user.home}
    
    • 1

    系统属性查询方式

    mvn help:system 
    
    • 1

    4.7 属性类别:环境变量属性

    作用

    • 使用Maven配置文件setting.xml中的标签属性,用于动态配置

    调用格式

    ${env.JAVA_HOME} 
    
    • 1

    环境变量属性查询方式

    mvn help:system 
    
    • 1

    5.版本管理

    5.1 工程版本区分

    6

    5.2 工程版本

    • SNAPSHOT(快照版本)

      • 项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本)

      • u快照版本会随着开发的进展不断更新

    • RELEASE(发布版本)

      • 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本

    5.3 工程版本号约定

    约定规范:

    • <主版本>.<次版本>.<增量版本>.<里程碑版本>

    • 主版本:表示项目重大架构的变更,如:spring5相较于spring4的迭代

    • 次版本:表示有较大的功能增加和变化,或者全面系统地修复漏洞

    • 增量版本:表示有重大漏洞的修复

    • 里程碑版本:表明一个版本的里程碑(版本内部)。这样的版本同下一个正式版本相比,相对来说不是很稳定,有待更多的测试

    范例:

    • 5.1.9.RELEASE

    6.资源配置

    6.1 资源配置多文件维护

    7

    6.2 配置文件引用pom属性

    • 作用
      • 在任意配置文件中加载pom文件中定义的属性
    • 调用格式
    ${jdbc.url} 
    
    • 1
    • 开启配置文件加载pom属性

      
      <resources>
          <resource>
              
              <directory>${project.basedir}/src/main/resourcesdirectory>
              
              <filtering>truefiltering>
          resource>
      resources>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

    7.多环境开发配置

    7.1 多环境兼容

    8

    7.2 多环境配置

    
    <profiles>
        
        <profile>
            
            <id>pro_envid>
            
            <properties>
                <jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_dbjdbc.url>
            properties>
            
            <activation>
                <activeByDefault>trueactiveByDefault>
            activation>
        profile>
        
        <profile>
            <id>dev_envid>
            ……
        profile>
    profiles>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    7.3 加载指定环境

    作用

    • 加载指定环境配置

    调用格式

    mvn 指令 –P 环境定义id
    
    • 1

    范例

    mvn install –P pro_env
    
    • 1

    8.跳过测试

    8.1 跳过测试环节的应用场景

    整体模块功能未开发

    模块中某个功能未开发完毕

    单个功能更新调试导致其他功能失败

    快速打包

    ……

    8.2 使用命令跳过测试

    命令

    mvn 指令 –D skipTests
    
    • 1

    注意事项

    • 执行的指令生命周期必须包含测试环节

    8.3 使用界面操作跳过测试

    9

    8.4 使用配置跳过测试

    <plugin>
        <artifactId>maven-surefire-pluginartifactId>
        <version>2.22.1version>
        <configuration>
            <skipTests>trueskipTests>
            <includes> 
                <include>**/User*Test.javainclude>
            includes>
            <excludes>
                <exclude>**/User*TestCase.javaexclude>
            excludes>
        configuration>
    plugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    9.私服

    9.1 分模块合作开发

    10

    9.2 Nexus

    Nexus是Sonatype公司的一款maven私服产品

    下载地址:https://help.sonatype.com/repomanager3/download

    9.3 Nexus*安装、启动与配置

    启动服务器(命令行启动)

    nexus.exe /run nexus
    
    • 1

    访问服务器(默认端口:8081)

    http://localhost:8081
    
    • 1

    修改基础配置信息

    • 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口

    修改服务器运行配置信息

    • 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间

    9.4 私服资源获取

    11

    9.5 仓库分类

    宿主仓库hosted

    • 保存无法从中央仓库获取的资源
      • 自主研发
      • 第三方非开源项目

    代理仓库proxy

    • 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库

    仓库组group

    • 将若干个仓库组成一个群组,简化配置
    • 仓库组不能保存资源,属于设计型仓库

    9.6 资源上传

    上传资源时提供对应的信息

    • 保存的位置(宿主仓库)

    • 资源文件

    • 对应坐标

    9.7 idea环境中资源上传与下载

    12

    9.8 访问私服配置(本地仓库访问私服)

    配置本地仓库访问私服的权限(setting.xml)

    <servers>
        <server>
            <id>heima-releaseid>
            <username>adminusername>
            <password>adminpassword>
        server>
        <server>
            <id>heima-snapshotsid>
            <username>adminusername>
            <password>adminpassword>
        server>
    servers>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    配置本地仓库资源来源(setting.xml)

    <mirrors>
        <mirror>
            <id>nexus-heimaid>
            <mirrorOf>*mirrorOf>
            <url>http://localhost:8081/repository/maven-public/url>
        mirror>
    mirrors>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    9.9 访问私服配置( 项目工程访问私服)

    配置当前项目访问私服上传资源的保存位置(pom.xml)

    <distributionManagement>
        <repository>
            <id>heima-releaseid>
            <url>http://localhost:8081/repository/heima-release/url>
        repository>
        <snapshotRepository>
            <id>heima-snapshotsid>
            <url>http://localhost:8081/repository/heima-snapshots/url>
        snapshotRepository>
    distributionManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    发布资源到私服命令

    mvn deploy
    
    • 1
  • 相关阅读:
    shiro授权
    Educational Codeforces Round 154 (Rated for Div. 2)A~C
    Python ... takes 0 positional arguments but 1 was given
    WPF实现树形表格控件(TreeListView)
    Spring AOP案例:测试业务层接口万次执行效率
    鸿蒙应用开发学习:使用视频播放(Video)组件播放视频和音频文件
    async与await
    一键启动的AI离线知识库,无需复杂环境依赖,小白都能上手了
    叮咚外卖小程序6.4.3+超级跑腿2.0.3+前端完美运营版【未编译前端+教程】
    WPF使用Microsoft.Toolkit.Mvvm框架记录
  • 原文地址:https://blog.csdn.net/m0_53743471/article/details/126379170