• 史上最全Maven学习(建议收藏)


    Maven 在美国是一个口语化的词语,代表专家、内行的意思。

    9a9aeffab857494ba8d3ba9988d1f3e4.gif

     

    Maven可以把你从上面的繁琐工作中解放出来,能帮你构建工程,管理jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成Web站点(Maven的一键构成)

    Maven的优势举例

    如果通过 Web 阶段项目,要能够将项目运行起来,就必须将该项目所依赖的一些 jar 包添加到工程中,否则项目就不能运行。试想如果具有相同架构的项目有十个,那么我们就需要将这一份jar包复制到十个不同的工程中。而WEB程序要运行,必须将项目运行所需的Jar包复制到工程目录中,从而导致了工程很大。同样的项目,如果我们使用Maven工程来构建,会发现总体上工程的大小会少很多(maven里面没有jar包)

    Maven的依赖管理

    依赖管理:maven工程对jar包的管理过程

    Maven 的一个核心特性就是依赖管理。当我们涉及到多模块的项目(包含成百个模块或者子项目),管理依赖就变成一项困难的任务。Maven 展示出了它对处理这种情形的高度控制。

    传统的 WEB 项目中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大。

    而maven工程中不直接将jar包导入到工程中,而是通过在pom.xml文件中添加所需jar 包的坐标,这样就很好的避免了jar直接引入进来,在需要用到jar包的时候,只要查找 pom.xml文件,再通过pom.xml文件中的坐标,到一个专门用于”存放jar包的仓库”(maven仓库)中根据坐标从而找到这些jar包,再把这些jar包拿去运行。运行过程如图:

    56c23f6a846f45c0bfa6d8130078150f.png

     

     

    Maven仓库的分类

    ·本地仓库:用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找默认本地仓库位置在${user.home}/.m2/repository,${user.home}表示windows用户目录。

    可以在MAVEN_HOME/conf/settings.xml文件中配置本地仓库位置:

     放置jar包的文件夹路径

    ·远程仓库【私服】:如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网内。远程仓库可以从本地上传jar包,也可以从中央仓库里下载。

    ·中央仓库:在maven软件中内置一个远程仓库地http://repo1.maven.org/maven2,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的jar包,它包含了世界上大部分流行的开源项目构件。

    ·总结

    1. 在默认情况下启动一个maven工程会从本地仓库找jar包,如果本地没有,会从中央仓库中下载jar包。

    2. 在公司中,启动一个maven工程,会从本地仓库找jar包,如果本地没有,回去私服(远程仓库)下载jar包。如果私服没有,可以从中央仓库下载,也可以从本地上传

    镜像仓库配置

    ·在setting文件中配置阿里云镜像仓库

    nexus-aliyun

    central

    Nexus aliyun

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

    Maven的坐标

    坐标:Maven中的坐标用于描述仓库中资源的位置

    https://mvnrepository.com

    ·Maven坐标主要组成

    groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)

    artifactld:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)

    version:定义当前版本号

    packaging:定义该项目的打包方式

    ·Maven坐标的作用

    使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由给机器完成

    Maven的使用

    Maven目录文件说明:

    bin:存放了maven的命令,如mvn tomcat:run

    boot:存放了一些maven本身的引导程序,如类加载器等

    conf:存放了maven的一些配置文件,如setting.xml文件

    lib:存放了maven本身运行所需的一些jar包

    Maven配置:

    1. 在系统变量中配置MAVEN_HOME,变量值就是maven安装的路径(bin目录之前一级目录)

    2. 在系统变量PATH中添加%MAVEN_HOME%\bin

    ·MAVEN运行需要依赖JAVA_HOME,因此需要确保JAVA_HOME的配置存在无误

    3. 打开cmd窗口,输入mvn -v确认是否安装成功

    Maven工程的目录结构:

    1af142e4c2df4f149dd2b88cc7a2f8c8.png

     

     

    src/main/java —— 存放项目的.java文件

    src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件

    src/test/java —— 存放所有单元测试.java文件,如JUnit测试类

    src/test/resources —— 测试资源文件

    src/main/webapp —— 页面资源,js,css,图片等

    target —— 项目输出位置,编译后的class文件会输出到此目录

    pom.xml——maven项目核心配置文件

    注意:如果是普通的java项目,那么就没有webapp目录。

     

    Maven工程的运行:

    在cmd窗口中进入maven工程目录(当前目录有pom.xml文件的位置),输入指令即可。

    Maven常用命令:

    mvn tomcat:run启动tomcat服务器。该指令会启动tomcat服务器并自动生成该Maven工程同名的虚拟目录,输入该路径将访问项目中webapp中的默认html/jsp文件所生成的页面

    mvn clean:maven工程的清理命令,执行clean会删除target目录及内容。

    mvn compile:maven工程的编译命令,作用是将src/main/java下的文件编译为class文件输出到target目录下。

    当接手一个项目一般会使用,因为之前开发时别人使用的jar包的版本、某些配置等等可能会与本机上的不同,因此需要删除掉此前的编译内容,再在本机中重新编译。

    mvn test:maven工程的测试命令,执行src/test/java下的单元测试类。

    当使用mvn test命令时,也同时会执行compile命令

    mvn package:maven工程的打包命令,对于java工程执行package打成jar包,对于web工程打成wa包。打包后的文件放置在target目录中

    可以通过pom.xml文件中的标签来设定打包格式

    mvn install:maven工程的安装命令,执行install将maven打成jar包或war包发布到本地仓库

    install命令首先会将compile、test、package全部执行,再将该maven发布到本地仓库中

     

    Maven的生命周期:

    maven 对项目构建过程分为三套相互独立的生命周期:

    Clean Lifecycle(清理生命周期)在进行真正的构建之前进行一些清理工作。

    mvn clean

    Default Lifecycle(默认生命周期)构建的核心部分,编译,测试,打包,安装等等。 默认生命周期有一套规律:当执行后面的命令时,会先将前面的命令全部执行一次

    compile -> test -> package -> install -> deploy(发布)

    Site Lifecycle(站点生命周期)生成项目报告,站点,发布站点。

    Maven的模型概念

    Maven 是一个项目管理工具,它包含了一个项目对象模型 (POMProject Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

    1e211c3bd8b34f6896f6a52341bf62e2.png

     

     

    l 项目对象模型 (Project Object Model)

    一个maven工程都有一个pom.xml文件,项目对象模型包含了pom.xml文件中的项目自身信息、项目运行所依赖的jar包信息、项目运行环境信息(jdk、tomcat信息等)而项目运行所依赖的jar包信息又独立为一个依赖管理模型

    l 依赖管理模型(Dependency Management System)

    通过maven的依赖管理对项目所依赖的jar包进行统一管理。maven会根据pom.xml文件中配置的内容去central(中央仓库)、b2b(远程仓库)、local(本地仓库)中寻找该jar包

    比如:

    · 项目依赖junit4.9,通过在pom.xml中定义junit4.9的依赖即使用junit4.9,如下所示是junit4.9的依赖定义:

    junit

    junit

    4.9

    test

    </dependencies>

    在一个依赖管理模型中,其中标签为公司组织的名称,为项目名,为版本号。这几部分是不可或缺的,这几部分也就构成了一个依赖管理模型

    项目安装插件tomcat7,通过在pom.xml中定义tomcat7的插件配置即使用tomcat7,如下所示是tomcat7的配置定义:

      

       

        

           org.apache.tomcat.maven

           tomcat7-maven-plugin

           2.1

       80

       /

    ·pom文档最上方的一些标识定义:

      

      4.0.0

      

      war

      

      com.itheima

      

      web01

      

      1.0-SNAPSHOT

    l 一个项目生命周期(Project Lifecycle)

    使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些过程规范为一个生命周期

    l 一组标准集合

    maven 将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。

    l 插件(plugin)目标(goal)

    maven 管理项目生命周期过程都是基于插件完成的。 每一个构建项目的命令都对应了一个maven底层的一个插件

    依赖传递

    · 依赖具有传递性

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

    ·间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

    70cd56fd7c234adc8cfd0a24c4e60067.png 

     

     

    依赖传递的冲突问题:

    · 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高

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

    · 特殊声明:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

    bb31f697405c4d27857d2e0206c32ecf.png

     

    可选依赖

    可选依赖:对外隐藏当前所依赖的资源--不透明

    操作:

    <--! 在dependency中加入该配置 -->

    >true

    排除依赖

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

    操作:

    <--! 在dependency中加入该配置 -->

    >

    org.hamcrest

    hamcrest-core

    依赖范围

    c1529d8ccdad472b835dd51de8b058d0.png

     

     

    依赖范围的传递性

     

    140d62779bd24d8692e4cf026afff2c9.png

     

     

  • 相关阅读:
    【系统架构设计师】第三章 数据库系统
    HTTP协议简单理解
    netty系列之:Bootstrap,ServerBootstrap和netty中的实现
    【网页设计】基于HTML+CSS+JavaScript学生网上报到系统响应式网站
    【FFH】从0到提交PR至OpenHarmony源仓库详细教程
    你知道网关 架构是如何演进?
    项目实战总结
    c++ 原子变量-Memory fence
    【zookeeper】问题解决 Authentication is not valid : /hbase/tokenauth
    Spark Standalone HA基本原理及部署
  • 原文地址:https://blog.csdn.net/LRXmrlirixing/article/details/126853723