Maven生命周期插件及命令

1.maven核心概念

①POM:一个文件名称是pom.xml , pom翻译过来叫做项目对象模型,maven把一个项目当做一个模型使用。控制maven构建项目的过程,管理jar依赖。

②约定的目录结构:maven项目的目录和文件的位置都是遵循规范的。

③项目坐标:唯一的字符串,用来表示项目资源的。

④依赖管理:管理项目可以使用jar包文件。

⑤仓库管理:jar包文件资源存放的位置。

⑥生命周期:maven工具构建项目的过程。

⑦插件和目标:执行maven构建的时候用的工具是插件。

⑧继承(本教程不说):一个 maven 项目可以继承另一个 maven 的依赖, 称为子项目父项目。

⑨聚合(本教程不说):父类型的模块,不需要有源代码和资源文件,也就是说,没有 src/main/java 和 src/test/java目录。Maven会首先解析聚合模块的POM文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块

2.maven生命周期

maven生命周期(项目构建的过程):对项目进行清理、编译、测试、报告、打包、安装、部署上传到私服的过程。

清理(mvn clean):它删除在构建编译和测试时在项目目录中生成target目录的文件。但是已经install到仓库里的包不会删除。

编译(mvn compile):maven可以批量的把程序源代码编译为执行代码(.java编译成.class),maven可以同时把成千上百的文件编译为class,javac不一样,javac一次编译一个文件。在pom.xml同级目录下生成target目录存放主程序编译之后的.class字节码文件。

测试编译(mvn test-compile):maven可以批量的同时执行测试程序代码以及测试功能,验证功能正确性,在pom.xml目录下生成target目录存放主程序编译之后的.class字节码文件。

测试(mvn test):maven可以批量的同时测试很多功能,在pom.xml同级目录下生成surefire-reports目录,保存测试结果。

报告:生成测试结果的文件存放在surefire-reports目录,测试通过没有。

打包(mvn package):把你的项目中src/main/java目录下所有的.class文件,src/main/resources目录下配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件,通常java程序,压缩文件是.jar扩展名的。对于web应用,压缩文件扩展名是.war。总而言之,会把编译、编译测试、测试、并且按照pom.xml配置把主程序打包生成jar包或者war包。

安装(mvn install):把打包(mvn package)中生成的文件jar、war安装到本地仓库。会把本工程打包,并且按照本工程的项目坐标(三个参数)保存到本地仓库中。

部署(mvn deploy):程序安装后可以执行,把本工程打包,按照本项目工程的项目坐标(三个参数)保存到本地仓库中,并且还会保存到私服仓库中以及自动把项目部署到web容器中。

注意:执行以上命令必须在命令行进入pom.xml所在目录!

3.maven仓库

(1)什么是maven仓库?

maven仓库是存放东西的,存放maven下载jar包和项目调用的jar包。

——maven使用的插件(各种jar包)

——项目使用的jar包(第三方的工具)

(2)仓库的分类

本地仓库: 用户个人计算机上的文件夹,存放各种jar包——使用地址是本机电脑磁盘上自定义盘符路径,默认地址路径是.m2

远程仓库:在互联网上使用网络才能使用的仓库,如mvnrepository、apache、aliyun等中央仓库。

——中央仓库:最权威的,全球开发人员都共享使用的一个集中的maven仓库。

中央仓库资源地址:https://mvnrepository.com/

——镜像中央仓库:中央仓库的备份,在各大洲,重要的城市都有镜像资源地址。

如阿里云的maven镜像的中央仓库:

http://maven.aliyun.com/nexus/content/groups/public/

http://maven.aliyun.com/nexus/content/repositories/central/

私服仓库:公司或组织内部局域网中使用,不对外使用。安全性高,通过网络访问私服仓库。

(3)仓库的使用——maven仓库调用不需要人为参与的。

开发人员获取jar资源(项目工程需要使用的jar,mysql驱动等资源)——>首先查找maven自定义本地仓库(本机电脑的文件夹目录)——>私服maven(公司组织局域网服务器)——>镜像中央仓库(aliyun、apache国内服务器)——>中央仓库(mvnrepository外国服务器)

说明:仓库使用顺序,本机(地)仓库没有的话,去私服查找,有的话就拷贝一份到本机(地)仓库。如果私服没有的话,就去镜像中央仓库查找,有的话,就拷贝分别拷贝一份到私服中央仓库和本机(地)仓库中。以此类推,直到外服中央仓库中查找,若外服中央仓库没有的话,说明开发人员需要调用的jar资源不存在,有的话就分别拷贝到各种级别的仓库中,供给开发人员离线调用开发资源,提高开发效率。

5.pom文件

pom.xml是maven的核心文件,是maven的灵魂。

生成结构说明:

(1)modelVersion:Maven模型的版本,对于Maven2和Maven3来说,它只能是4.0.0。

<modelVersion>4.0.0</modelVersion>

(2)groupId:组织id,一般是公司域名的倒写。格式可以为:

——域名倒写。例如com.baidu

——域名倒写+项目名。例如com.baidu.projectname

    <groupId>com.kesteler</groupId>
 
    <groupId>com.kesteler.projectname</groupId>

(3)artifactId:项目名称,也是模块名称,对应groupId中项目中的子项目

<artifactId>projectname</artifactId>

(4)version:项目版本号。如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOT,version使用三位数字标识,例如1.1.0。

 <version>1.0-SNAPSHOT</version>

(5)gav:以上的groupId、artifactId、version三个元素合并在一起统称为项目坐标,项目坐标具有唯一性,称之为唯一值,在互联网中唯一标识一个项目的,在中央仓库中就是根据项目坐标的唯一值,在资源库中搜索下载相应的jar包。

    <groupId>公司域名的倒序</groupId>
    <artifactId>自定义项目名称</artifactId>
    <version>自定义版本号</version>

例如,想要在中央仓库中获取mysql连接驱动,必须在pom.xml中声明mysql连接驱动在仓库中唯一性项目坐标搜索下载jar包。搜索地址:https://mvnrepository.com/键入mysql关键字。

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.20</version>
    </dependency>

(6)packaging:项目打包的类型,可以是jar、rar、ear、pom,web应用是war, packaging可以不写,默认是jar。

(7)dependencies和dependency(依赖):项目中要使用的各种资源说明,比我的项目要使用mysql驱动,Maven的一个重要作用就是管理jar包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的jar包,在 Maven中,这些jar就被称为依赖,使用标签dependency来配置。而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出,maven把所有的jar包也都视为项目存在了。

依赖也有自己的项目坐标,用作中央仓库唯一值标识。

<!--  依赖 相当于java代码中的 import -->
  <dependencies>
    
    <!--mysql的依赖 https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.20</version>
    </dependency>
    <!--单元测试程序的依赖 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    
  </dependencies>

(8)properties:properties是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。

  <!--配置属性 -->
  <properties>
    <!--构建源码编码方式 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!--jdk版本 -->
    <java.version>14</java.version>
    <!--maven构建版本号 -->
    <maven.compiler.source>14</maven.compiler.source>
    <maven.compiler.target>14</maven.compiler.target>
  </properties>

(9)build:表示与构建相关的配置,例如设置编译插件的jdk版本、插件配置等。

例如,使用maven项目骨架快速创建java项目时,会自动生成一堆的maven生命周期的插件,都放在build中:

<build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

6.maven命令+插件之间的关联

maven命令:maven独立使用,通过命令,完成maven的生命周期的执行。maven可以使用命令,完成项目的清理,编译,测试等等。

maven的插件:maven命令执行时,真正完成功能的是插件,插件是一些jar文件,一些类。

换言之,想要完成maven生命周期的清理,编译,测试,报告,打包,安装,部署等功能,就得通过使用maven命令去调用maven插件,由插件执行完成清理,编译,测试,报告,打包,安装,部署等功能。因此它们三个是一个不可分割的整体。

7.单元测试junit

单元测试:用的是junit,是一个专门测试的框架(工具)。

junit测试内容:测试的是类中的方法,每一个方法都是独立测试的。方法是测试的基本单位(单元)。

maven借助单元测试,批量测试类中的大量方法是否符合预期的。

使用步骤:

(1)在pom.xml中加入依赖

<!--单元测试程序的依赖 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

(2)在maven项目中的src/test/java目录下,创建测试程序。

推荐的创建类和方法的提示:

——测试类的名称是Test +你要测试的类名

——测试的方法名称是:Test +方法名称

例如:想要测试MavenTest.java

——创建测试类:TestMavenTest

@Test
public void testAdd(){
 
    测试He1loMaven的add方法是否正确
 
}

其中testAdd叫做测试方法,它的定义规则遵循以下4点:

——方法是public的,必须的。

——方法没有返回值,,必须的

——方法名称是自定义的,推荐是Test +方法名称

——方法的上面加入@Test

(3)创建HelloMaven.java,如下:

package com.kesteler.maventest;

public class MavenTest {
    public static void main(String[] args) {
        MavenTest helloMaven = new MavenTest();
        int addValue = helloMaven.add(100, 200);
        System.out.println("100+200计算结果=" + addValue);
    }

    public int add(int a, int b) {
        return a + b;
    }

}

(4)创建TestHelloMaven.java,如下:

package com.kesteler.maventest;

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

public class TestMavenTest {
    @Test
    public void TestAdd(){
        System.out.println("maven junit 执行了testAdd()!");
        MavenTest helloMaven = new MavenTest();
        int testAddValue = helloMaven.add(100, 200);
        //验证100+200是不是300 ,junit提供的方法,对比结果的
        //assertEquals(期望值,实际值),如果两个值相等证明是正确的,不相等就抛出异常==等于==错误
        Assert.assertEquals(300, testAddValue);
    }
}

8.使用maven命令及生命周期插件

在控制台输入口令或者idea右侧界面操作

(1)maven的编译——mvn compile

maven命令编译之前:maven.txt随便创建的资源文件

maven使用命令编译后:mvn compile

maven命令的mvn compile编译功能由两个插件完成,分别是:

maven-resources-plugin-2.6.jar
maven-compiler-plugin-3.1.jar

——maven-resources-plugin-2.6.jar:把src/main/resources/所有资源文件同时拷贝到mvn compile编译的target根目录下。

——maven-compiler-plugin-3.1.jar:编译src/main/所有java源程序,编译之后生成xxx.class字节码文件同时拷贝存放到mvn compile编译的target/classes/包名(com.zhangsong.maventest)目录下。

(2)maven的清理——mvn clean

maven命令清理之前:target目录是mvn compile编译生成的目录,执行mvn clean,将会删除target目录(打包存放到本地仓库或本机仓库文件夹的jar包资源不会被删除)。mvn命令的mvn clean清理功能由插件完成。

maven-clean-plugin:2.5.jar

删除target目录及其中存放所有同时拷贝的.class和资源文件。

(3)maven的测试编译——mvn test-compile

由两个插件

maven-resources-plugin-2.6.jar
maven-compiler-plugin- 3.1.jar

与mvn compile使用插件相同,区别是编译的文件不同,生成的.class和resources存放目录不同。

在java语言中,编译时和运行时是不同时期独立进行的。因此这里,通过maven命令测试编译+junit单元测试进行编译时期测试程序。搞清楚这一点,咱们继续。而上面4部分(单元测试junit)中测试类TestHelloMaven.java已经创建,而它只是.java源程序,要编译成.class字节码文件,才能测试程序。测试程序编译后同时拷贝到target/test-classes/包名(com.zhangsong.maventest)目录中

(4)maven的测试:mvn test

由一个插件完成测试程序的功能。

maven-surefire-plugin:2.12.4.jar

根据maven生命周期特性,当mvn test命令执行时,会再次执行mvn compile命令以及mvn test-compile命令,就是再次从生命周期头部开始执行。因此,当我们使用mvn test时,其实已经自动编译或拷贝src/main/所有资源和src/test/所有资源到target对应的classes目录下或test-classes目录下。

使用mvn test不论 BUILD SUCCESS(构建成功) 或者 BUILD FAILED(构建失败)都会在target目录中生成一个测试报告的目录target/surefire-reports,用作记录mvn test测试的结果信息测试报告文件分别用一个.txt文件和一个.xml文件记录。记录信息有:

Tests run(测试个数)
Failures(测试失败数)
Errors(测试错误数)
skipped(测试跳过数)
elapsed(测试时间)

(5)maven的打包:mvn package

把编译mvn compile、编译测试mvn test-compile、测试mvn test、并且按照pom.xml配置把主程序打包生成jar包或者war包。 maven命令mvn package由一个插件完成打包。

maven-jar-plugin-2.4.jar

生成jar包名称由项目坐标的artifactId-version.jar来统一规范命名,这是maven默认规范,不建议更改。如:HelloMaven-1.0-SNAPSHOT.jar。

<artifactId>SSMDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 打包方式 -->
    <packaging>jar</packaging>

对mvn package打包生成文件说明

目录结构:仅打包src/main中的所以资源(java目录+resources目录)和pom.xml等版本参数信息,其它目录资源不打包。

mvn package--->HelloMaven-1.0-SNAPSHOT.jar

├──com
│ └─zhangsong
│ └─maventest(路径:\com\zhangsong\maventest\)
│ └─HelloMaven.class(拷贝src/main/java/所有源代码)

└──META-INF
│ └─maven
│ │ └─com.zhangsong.maventest
│ │ └─HelloMaven(路径:\META-INF\maven\com.zhangsong.maventest\HelloMaven\)
│ │ └─pom.properties(打包时的时间和项目坐标的三个参数)
│ │ │
│ │ └─pom.xml(打包时拷贝项目工程的pom.xml)
│ │
│ └─MANIFEST.MF(打包时的清单版本、和存档版本、maven版本、jdk版本、操作打包的账户名【C盘User名称】)


└──maven.txt(拷贝src/main/resources/所有资源文件)

——pom.properties文件:打包时的时间和项目坐标的三个参数内容如下:

#Generated by Maven
#Thu Jul 22 17:00:39 CST 2021
version=1.0-SNAPSHOT
groupId=com.zhangsong.maventest
artifactId=HelloMaven

——pom.xml文件:内容与项目工程pom.xml一样。

(6)maven的安装:mvn install

maven-install-plugin

安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中。方便某些重要项目离线保存或某些组织共享资源。执行mvn install,也要把compile、test-compile、test、package四个生命周期重复执行一次,每个周期命令对应的功能也会自动执行。

安装在本地仓库中的jar包位置和名称如何确定呢?

——位置是路径,路径取决去项目坐标3个参数的拼接。拼接时,遇到“.”就分割成文件夹。D:\Program Files\apache-maven-3.6.3-bin\repository\com\kesteler\ssm\SSMDemo\1.0-SNAPSHOT

——名称是artifactId-version.jar(固定规范)

安装在本地仓库中的jar如何引用呢?

——在非当前项目的pom.xml中的依赖处,引入该jar包项目坐标即可。

    <dependencies>
        <!--本地仓库jar包项目坐标 -->
        <dependency>
            <groupId>组织名</groupId>
            <artifactId>模块名</artifactId>
            <version>版本号</version>
        </dependency>
        <!--本地仓库SSMDemo-1.0-SNAPSHOT.jar包项目坐标 -->
        <dependency>
            <groupId>com.kesteler.ssm</groupId>
            <artifactId>SSMDemo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

(7)maven的部署:mvn deploy

涉及到服务器搭建和web配置

配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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.kesteler.ssm</groupId>
    <artifactId>SSMDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 打包方式 -->
    <packaging>jar</packaging>

    <!--定义配置属性-->
    <properties>
        <!--构建源码编码方式 -->
        <!--<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>-->
        <!--maven构建版本号 -->
        <maven.compiler.source>14</maven.compiler.source>
        <maven.compiler.target>14</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- Mybatis核心 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!--控制 dependency 元素的使用范围-->
            <scope>test</scope>
        </dependency>
        <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.20</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>
        </plugins>
        <!--pluginManagement是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件-->
        <!--pluginManagement主要是为了统一管理插件,确保所有子POM使用的插件版本保持一致-->
        <pluginManagement>
            <!--<plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.7.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.20.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
                &lt;!&ndash;为Java项目生成静态HTML网站的插件&ndash;&gt;
                <plugin>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>3.3</version>
                </plugin>
                &lt;!&ndash;统计maven依赖等信息&ndash;&gt;
                <plugin>
                    <artifactId>maven-project-info-reports-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
            </plugins>-->
        </pluginManagement>
    </build>

</project>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值