Maven知识点汇总

一、目前的技术在开发中存在的问题

  • 如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个项目,利于分工协作。
  • 项目中需要的jar包必须手动“复制”、”粘贴” 到WEB-INF/lib 项目下,同样的jar包文件重复出现在不同的项目工程中,一方面浪费存储空间,另外也让工程比较臃肿。
  • 工程中所需要的jar包需要别人替我们准备好或到官网下载
  • 一个jar包依赖的其他jar包需要自己手动加到项目中

二、使用maven的好处

  • 借助于Maven就可以将一个项目拆分成多个工程。
  • Maven可以将jar包仅仅保存在“仓库”中,有需要使用的工程会“引用”这个文件,并不需要重复复制。
  • 所有知名框架或第三方工具jar包已经按照统一规范放在了Maven的中央仓库中。
  • Maven会自动将被依赖的jar包导入进来。

三、Maven的定义

Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理 ,Maven 这个单词的本意是:专家,内行,读音是[‘meɪv(ə)n]或[‘mevn]。构建工具的发展:Make→Ant→Maven→Gradle。

四、构建的定义及内容

  • 构建:就是以我们编写的Java代码、框架配置文件、国际化等其他资源文件、jsp页面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。
  • 构建过程中的几个主要环节:
    • 清理:删除以前的编译结果,为重新编译做好准备。
    • 编译:将Java源程序编译为字节码文件。
    • 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
    • 报告:将每一次测试后以标准的格式记录和展示测试结果。
    • 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对象war包。
    • 安装:在Maven环境下特指将打包的结果——Jar包或War包安装到本地仓库中。
    • 部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。

五、创建约定的目录结构

  • 根目录:工程名
  • src目录:源码
  • pom.xml文件:Maven工程的核心配置文件
  • main目录:存放主程序
  • test目录:存放测试程序
  • java目录:存放java源文件
  • resource目录:存放框架或其他工具的配置文件

 

 遵守的约定的目录结构的原因:

  • Maven要负责整个项目的自动化构建,以编译为例,Maven要想自动编译,那么它必须知道Java源文件保存在哪里。
  • 若自己定义的东西想让框架或工具知道,则有两种方式: 
    • 以配置的方式告诉框架 
    • 遵守框架内部已经存在的约定  

六、常用Maven命令

  • mvc clean:清理
  • mvn compile:编译主程序
  •  mvn test-compile:编译测试程序
  • mvn test:执行测试
  • mvn package:执行打包
  • mvn install : 安装
  • mvn site :生成站点
  • 注:执行与构建过程相关的Maven命令,比如编译、测试、打包等,必须进入pom.xml所在的目录。

七、Maven的核心概念

1、约定的目录结构

  • 参考上文第五点

2、POM

  • 含义:Project Object Model 项目对象模型
  • pom.xml 对于 Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置,重要程度相当于web.xml 对于动态web工程

3、坐标 

  • 数学中的坐标:
    • 在平面中,使用X,Y坐标可以唯一的定位平面中任何一个点。
    • 在空间中,使用X,Y,Z三个向量可以唯一的定位空间中的任何一个点。
  • Maven的坐标:使用下面三个向量在仓库中唯一定位一个Maven工程

【1】groupid:公司或组织域名倒序+项目名

< groupid>cn.rjxy.maven< /groupid>

【2】artifactid:模块名

< artifactid>Hello< /artifactid>

【3】version:版本

< version>1.0.0< /version>

Maven 工程的坐标与仓库中路径的对应关系,比如:org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar

< groupId>org.springframework< /groupId>
< artifactId>spring-core< /artifactId>
< version>4.0.0.RELEASE< /version>

注意:我们自己的 Maven 工程必须执行安装操作才会进入仓库。安装的命令是:mvn install

4、依赖 

【1】当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。Maven解析依赖信息时会到仓库中查找被依赖的jar包。对于我们自己开发的Maven工程,要使用mvn install 命令安装后就可以进入仓库。

【2】依赖的排除,如果我们当前工程中引入了一个依赖是A,而A又依赖了B,那么Maven会自动将A依赖的B引入当前工程,但是个别情况下B有可能是一个不稳定版本,或对当前工程有不良影响。这时我们可以在引入A的时候将B排除。

①情景举例

②配置方式

<dependency>

<groupId>com.atguigu.maven</groupId>

<artifactId>HelloFriend</artifactId>

<version>0.0.1-SNAPSHOT</version>

<type>jar</type>

<scope>compile</scope>

<exclusions>

    < exclusion>

        <groupId>commons-logging</groupId>

        <artifactId>commons-logging</artifactId>

    </ exclusion> 

</exclusions>

</dependency>

【3】依赖的原则,解决jar包冲突

  • 路径最短者优先
  • 路径相同时先声明者优先


5、仓库

【1】仓库的分类

  1. 本地仓库:当前电脑上部署的仓库目录,为当前本机电脑上的所有Maven工程服务
  2. 远程仓库   
    1. 私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务
    2. 中央仓库:架设在Internet上,为全世界所有Maven工程服务。
    3. 中央仓库镜像:架设在各个大洲,为中央仓库分担流量,减轻中央仓库的压力,提升用户的访问速度。

【2】仓库中保存的内容

  • Maven自身所需要的插件
  • 第三方框架或工具的jar包(第一方是jdk,第二方是自己)
  • 自己开发的Maven工程

【3】Maven核心程序寻找仓库的方式

Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成,而插件本身并不包含在Maven的核心程序中,因此Maven核心程序需要寻找这些插件。

  • 当我们执行的Mavne命令需要用到某些插件时,Mavne的核心程序首先会到本地仓库中查找,本地仓库的默认位置是:[系统中当前用户的家目录]\.m2\repository。比如:C:\Users\用户名\.m2\repository。
  • 如果Maven核心程序在本地仓库中没有找到所需要的插件,那么它会自动连接外网,到中央仓库中下载。若此时无法连接外网,则构建失败。

当然可以修改默认本地仓库的位置,可以让Maven核心程序到事先准备好的目录下查找插件。

  1. 找到Maven的配置文件:apache-maven-3.3.9\conf\settings.xml。
  2. 在settings.xml中找到localRepository标签。
  3. 将<localRepository>/path/to/local/repo</localRepository>从注释中取出。
  4. 将标签体内容修改为已经准备好的Maven仓库目录。

6、生命周期

【1】各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行。

【2】Maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。

【3】Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期中各个阶段,不论现在要执行生命周期中的哪一阶段,都是从这个生    命周期最初的位置开始执行。

【4】Maven有三套相互独立的生命周期,分别是:

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle 构建的核心部分,编译、测试、打包、安装、部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

他们相互独立。也可以直接运行 mvn clean install site 运行所有这三套生命周期。

【5】每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行 mvn clean,这个 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段。

Clean声明周期

  • pre-clean 执行一些需要在clean之前完成的工作
  • clean 移除所有上一次构建生成的文件
  • post-clean 执行一些需要在clean 之后立刻完成的工作

Default声明周期

  • Default 生命周期是 Maven 生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
  • process-resources 复制并处理资源文件,至目标目录,准备打包。
  • compile 编译项目的源代码。
  • process-test-resources 复制并处理资源文件,至目标测试目录。
  • test-compile 编译测试源代码。
  • test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
  • package 接受编译好的代码,打包成可发布的格式,如 JAR。
  • install 将包安装至本地仓库,以让其它项目依赖。
  • deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。

Site生命周期

  • pre-site 执行一些需要在生成站点文档之前完成的工作
  • site 生成项目的站点文档
  • post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy 将生成的站点文档部署到特定的服务器上

这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这是 Maven 相当强大的功能,对于Manager来说比较喜欢,文档及统计数据自动生成,方便观看。

7、插件和目标

  • Maven的核心仅仅定义了抽象的声明周期,具体的任务都是交由插件完成的,每个插件都实现多个功能,每个功能就是一个插件目标
  • Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务,可以将目标看做“调用插件功能的命令”
  • 例如:compile 就是插件 maven-compiler-plugin 的一个目标;pre-clean 是插件 maven-clean-plugin 的一个目标。

8、继承

【1】现状

  • Hello依赖的Junit:4.0
  • HelloFriend依赖的Junit:4.0
  • MakeFriends依赖的Junit:4.9

由于test范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致。

【2】需求:统一管理各个模块工程中对Junit依赖的版本。

【3】解决思路:将Junit依赖统一提取到“父”工程中,在子工程中声明Junit依赖是不指定版本,以父工程中统一设定的为准。同时也便于修改。

【4】操作步骤:

  • 创建一个Maven工程作为父工程,注意:打包方式为pom
  • 在子工程中声明对父工程的引用

<parent>
        <groupId>cn.rjxy.maven</groupId>
        <artifactId>Parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../Parent/pom.xml</relativePath>
    </parent>

  • 将子工程的坐标中与父工程坐标中重复的内容删除

  • 在父工程中统一管理Junit的依赖

<dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>junit</groupId>

                <artifactId>junit</artifactId>

                <version>4.9</version>

                <scope>test</scope>

            </dependency>

        </dependencies>

</dependencyManagement>

  • 在子工程中删除Junit依赖的版本号部分,如果不删,则会默认保留当前版本号,不会随父工程改变

 注意:配置集成后,执行安装命令时要先安装父工程。

9、聚合

【1】作用:一键安装各个模块工程。

【2】配置方式:在一个“总的聚合工程”中配置各个参与聚合的模块

<modules>
        <!-- 指定各个子工程的相对路径 -->
        <module>../Hello</module>
        <module>../HelloFriend</module>
        <module>../MakeFriends</module>
    </modules>

【3】使用方式:在聚合工程的pom.xml 上点右键->run as->maven install

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值