(Maven笔记)Maven生命周期插件及命令使用pom.xml

 写在前面,下图是本章涉及知识的思维导图

 用心记录,感谢赏识~~~


目录

  • 1.maven核心概念
  • 2.maven生命周期
  • 3.maven仓库
  • 4.pom文件
  • 5.maven生命周期
  • 6.maven命令+插件之间的关联
  • 7.单元测试junit
  • 8.使用maven命令及生命周期插件
    • (1)maven的编译——mvn compile

    • (2)maven的清理——mvn clean

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

    • (4)maven的测试:mvn test

    • (5)maven的打包:mvn package

    • (6)maven的安装:mvn install

    • (7)maven的部署:mvn deploy

  • 9.总结

1.maven核心概念

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

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

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

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

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

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

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

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

⑨聚合(本教程不说)父类型的模块,不需要有源代码和资源文件,也就是说,没有 src/main/javasrc/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)中生成的文件jarwar安装到本地仓库。会把本工程打包,并且按照本工程的项目坐标(三个参数)保存到本地仓库中。
  • 部署(mvn deploy):程序安装后可以执行,把本工程打包,按照本项目工程的项目坐标(三个参数)保存到本地仓库中,并且还会保存到私服仓库中以及自动把项目部署web容器中。

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


3.maven仓库

        (1)什么是maven仓库?

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

                ——maven使用的插件(各种jar包)
                ——项目使用的jar包(第三方的工具)

        (2)仓库的分类

  • 本地仓库: 用户个人计算机上的文件夹,存放各种jar包——使用地址是本机电脑磁盘上自定义盘符路径,默认地址路径是.m2
  • 远程仓库:互联网上使用网络才能使用的仓库,如mvnrepositoryapachealiyun中央仓库

        ——中央仓库:最权威的,全球开发人员都共享使用的一个集中的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(公司组织局域网服务器)——>镜像中央仓库(aliyunapache国内服务器)——>中央仓库(mvnrepository外国服务器)

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


5.pom文件

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

        生成结构说明:

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

    <modelVersion>4.0.0</modelVersion>

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

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

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

    <groupId>com.baidu</groupId>

    <groupId>com.baidu.projectname</groupId>

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

    <artifactId>projectname</artifactId>

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

    <version>1.0-SNAPSHOT</version>

        (5)gav:以上的groupIdartifactIdversion三个元素合并在一起统称为项目坐标,项目坐标具有唯一性,称之为唯一值,在互联网中唯一标识一个项目的,中央仓库中就是根据项目坐标的唯一值,在资源库中搜索下载相应的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.38</version>
    </dependency>

        (6)packaging:项目打包的类型,可以是jarrarearpom,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.38</version>
    </dependency>
    <!--单元测试程序的依赖 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</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>1.8</java.version>
    <!--maven构建版本号 -->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</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 +方法名称
        例如:想要测试HelloMaven.java

                ——创建测试类:TestHelloMaven

@Test
public void testAdd(){

    测试He1loMaven的add方法是否正确

}

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

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

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

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

                ——方法的上面加入@Test

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

package com.zhangsong.maventest;

/**
 * created by on 2021/7/22
 * 描述:Manven——单元测试类
 *
 * @author ZSAndroid
 * @create 2021-07-22-12:07
 */
public class HelloMaven {
    public static void main(String[] args) {
        HelloMaven helloMaven = new HelloMaven();
        int addValue = helloMaven.add(100, 200);
        System.out.println("100+200计算结果=" + addValue);
    }

    /**
     * 计算两个整数之和的方法
     * @param a 第一个数
     * @param b 第一个数
     * @return
     */
    public int add(int a, int b) {
        return a + b;
    }
}

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

package com.zhangsong.maventest;

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

/**
 * created by on 2021/7/22
 * 描述:Maven——单元测试类
 *
 * @author ZSAndroid
 * @create 2021-07-22-12:13
 */
public class TestHelloMaven {
    @Test
    public void testAdd() {
        System.out.println("maven junit 执行了testAdd()!");
        HelloMaven helloMaven = new HelloMaven();
        int testAddValue = helloMaven.add(100, 200);
        //验证100+200是不是300 ,junit提供的方法,对比结果的
        //assertEquals(期望值,实际值),如果两个值相等证明是正确的,不相等就抛出异常==等于==错误
        Assert.assertEquals(300, testAddValue);
    }
}

        到这里mavenjunit单元测试类已经创建成功,下面结合maven常用命令生命周期插件一起使用,实践一下。 


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

        (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>HelloMaven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--    打包格式-->
    <packaging>jar</packaging>

                           对mvn package打包生成HelloMaven-1.0-SNAPSHOT.jar文件说明

                           目录结构:仅打包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/所有资源文件) 

                           ——HelloMaven.class对应src/main/java/所有源代码

                            ——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一样。

<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.zhangsong.maventest</groupId>
    <artifactId>HelloMaven</artifactId>
    <version>1.0-SNAPSHOT</version>
<!--    打包格式-->
    <packaging>jar</packaging>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

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

</project>

                            ——MANIFEST.MF目录:打包时的清单版本、和存档版本、maven版本、jdk

                            本、操作打包的账户名C盘User名称

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: ZSAndroid
Created-By: Apache Maven 3.8.1
Build-Jdk: 1.8.0_152

                            ——maven.txt文件:拷贝src/main/resources/所有资源文件


         (6)maven的安装:mvn install

                          maven-install-plugin

                            安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中。方便

                            些重要项目离线保存或某些组织共享资源。

                            执行mvn install,也要把compiletest-compiletestpackage四个生命周

                            期重复执行一次,每个周期命令对应功能也会自动执行。

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

                             ——位置是路径,路径取决去项目坐标3个参数的拼接。拼接时,遇到“.”就分

                             割成文件夹。\com\zhangsong\maventest\HelloMaven\1.0-SNAPSHOT

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

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

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

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

         (7)maven的部署:mvn deploy

                            涉及到服务器搭建和web配置,这里就不介绍了,因为俺也不会~~~


9.总结

仅自己学习记录,如有错误,敬请谅解~,谢谢~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电竞丶小松哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值