• java基础巩固10


    Maven介绍

    (1)Maven就是专门为Java项目打造的管理和构建工具,它的主要功能有:
    提供了一套标准化项目结构;
    提供了一套标准化的构建流程(编译,测试,打包,发布);
    提供了一套依赖管理机制
    (2)一个使用Maven管理的Java项目,它的目录结构默认如下:
    在这里插入图片描述
    项目的根目录是a-maven-project是项目名,它有一个项目描述文件pom.xml,存放Java源码的目录时src/main/java,存放资源文件的目录是src/main/resource,存放测试源码的目录src/test/java,存放测试资源的目录是src/test/resource,最后,所有编译打包生成的文件都放在target目录里面,这些就是一个Maven项目的标准目录结构。所有的目录结构都是约定好的标准结构,我们千万不要随意修改目录结构。使用标准结构不需要做任何配置,Maven就可以正常使用。
    (3)使用/声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。
    (4)pom.xml:
    其中,groupId类似于java的包名,通常是公司或者组织名称。artifactId类似于java的类名,通常是项目名称,再加上version,一个Maven工程就是由groupId,artifactId和version作为唯一标识。

    依赖管理

    (1)Maven解决了依赖管理问题,我们声明了自己的项目需要abc,Maven会自动导入abc的jar包,再判断出abc需要xyz,又会自动导入xyz的jar包,这样,最终我们的项目会依赖abc和xyz两个jar包。
    (2)maven定义了几种依赖关系,分别是compile、test、runtime和provided;
    compile:编译时需要用到该jar包(默认)
    test:编译Test时需要用到该jar包
    runtime:编译时不需要,但运行时需要
    provieded 编译是需要用到,但运行时由jdk或某个服务器提供
    其中,默认的compile是最常用的,Maven会把这种类型的依赖直接放入classpath。
    test依赖表示仅在测试时使用,正常运行时并不需要,最常用的test依赖就是JUnit。
    runtime依赖表示编译时不需要,但运行时需要,最典型的runtime依赖是JDBC驱动,例如MySQL驱动;
    provided依赖表示编译时需要,但运行时不需要。最典型的provided依赖是Servlet API,编译的时候需要,但是运行时,Servlet服务器内置了相关的jar所以运行期不需要。
    (3)最后一个问题是,Maven如何知道从何处下载所需要的依赖,答案是Maven维护了一个中央仓库,所有第三方库将自身的jar以及相关信息上传至中央仓库,Maven就可以从中央仓库把所需依赖下载到本地。Maven并不会每次都从中央仓库下载jar包,一个jar包一旦被下载过,就会被Maven自动缓存在本地仓库中,所以,除了第一次编译时因为下载需要比较慢,后悔过程因为本地缓存,并不会重复下载同样的jar包。
    (4)Maven通过对jar包进行PGP签名确保任何一个jar包一旦经过发布就无法修改。修改已发布jar包的唯一方法是发布一个新版本。只有以-SNAPSHOT结尾的版本号会被Maven视为开发版本,开发版本每次都会重复下载,这种SNAPSHOT版本只能用于内部私有的Maven repo,公开发布的版本不允许出现SNAPSHOT。

    构建流程

    (1)Maven不但有标准化的项目结构,而且还有一套标准化的构建流程,可以自动化实现编译,打包,发布等。
    (2)Lifecycle和Phase
    使用maven时,我们首先要了解什么是maven的声明周期(lifecycle)。Maven的生命周期由一系列阶段(phase)构成,以内置的生命周期default为例,它包含以下阶段:
    在这里插入图片描述

    如果我们运行mvn package, Maven就会执行default生命周期,它会从开始一直运行到package这个phase为止;
    如果我们运行mvn compile,Maven就会执行default声明周期,但这次它只会运行到compile。
    Maven另一个常用的声明周期是clean,它会执行三个phase:
    pre-clean;clean;pose-clean
    所以,我们使用mvn这个命令时,后面的参数是phase,Maven自动根据生命周期运行到指定的phase。
    (3)Goal
    执行一个phase又会触发一个或者多个goal:
    在这里插入图片描述
    goal的命名总是abc:xyz这种形式。作为类比:
    lifecycle相当于Java的package,它包含一个或者多个phase;
    phase相当于java的class,它包含一个或者多个goal
    goal相当于class的method,它其实才是真正干活的。
    大多数情况下,我们只要指定phase,就默认执行这些phase默认绑定的goal,只有少数情况下,我们可以直接指定运行一个goal,例如,启动Tomcat服务器:
    mvn tomcat:run

    使用插件

    (1)使用Maven构建项目就是执行lifecycle,执行到指定的阶段为止,每个阶段会执行自己默认的一个或者多个goal,goal是最小任务单元。实际上,执行每个phase,都是通过某个插件(plugin)来执行的,Maven本身其实并不知道如何执行compile,它只是负责找到对应的compiler插件,然后执行默认的compiler:compile这个goal来完成编译。所以,使用Maven,实际上就是配置好需要使用的插件,然后通过phase调用他们。
    (2)如果标准插件无法满足需求,我们还可以使用自定义插件。

    模块管理

    (1)Maven可以有效地管理多个模块,我么你只需要把每个模块当做一个独立的Maven项目,它们有各自的pom.xml

  • 相关阅读:
    设计模式:责任链模式
    Erasure-Code-擦除码-2-实现篇
    24.Vue条件渲染
    32 【Navigator 对象和Screen 对象】
    vue当中的mixin混入、插件使用
    SLAM中的二进制词袋生成过程和工作原理
    MySQL表的操作
    mysql 锁定解除
    HIVE SQL regexp_extract和regexp_replace配合使用正则提取多个符合条件的值
    Selenium自动化测试之Selenium IDE
  • 原文地址:https://blog.csdn.net/weixin_49131718/article/details/126488941