Maven

69 阅读8分钟
									CSS--Maven

一.Maven介绍:

是对java项目进行 (构建管理,和 依赖管理)的工具(软件)。

1.学习目标:

掌握meven安装、配置、以及基本的功能(项目构建 依赖管理) 的使用

2.核心功能:

a:依赖管理:管理项目的依赖(jar包); (给项目导入jar包)

b:构建管理:构建:即实现:java源代码(.java)--打包运行代码(.class)

原来我们是直接使用idea进行构建,那我们使用maven进行构建的原因是:

1.maven构建触发方便:直接使用命令/可视化工具即可

2.构建要求项目结构:格式固定化的,用任何软件都能进行开发; 使用idea等工具书写代码,使用meven工具进行 项目构建(因为如果都在不同的软件书写+构建的话,换了开发工具,使用方式变化,所以统一使用meven构建)

3.为什么使用meven:SSM+Spring Boot 等技术都不是java原生的技术,属于第三方技术,都需要导入大量的第三方jar包,如果不适应maven,我们就需要自己手动导入jar包,如果有了mave,它就可以把依赖全都下载下来;

3.Maven的GAVP属性

G:GroupID 格式; A: ArtifactID 格式:产品线名-模块名; V: Version版本号;

P:Packaging:将项目打包为什么类型的文件; java工程:.jar包; web工程:war包; pom:不打包;

<!-- 想要哪些依赖:直接在这个pom.xml文件中写即可 -->
G属性; A属性; V属性
<!--packing:默认是jar包:代表是java普通工程-->

4.如何使用JBL工具构建web工程:(如何创建maven工程)

a:创建javase -maven工程; b:右击:JBL

5.Maven工程项目结构说明

6.maven核心功能1 --依赖管理

1.学习目标:

重点:编写 pom.xml文件。 (记忆标签的使用)

当我们程序需要第三方依赖时,我们就不需要手动导包了,只需要把“ 依赖信息 ”(标签)声明写到配置文件pom.xml文件中:最后由maven自动下载相关的依赖到项目中即可。

详情查看:javaee-maven-project-03 的pom.xml文件



2.依赖管理的两个特性:**

(1)依赖传递

1.:只需要导入一个依赖,就会自动导入依赖的依赖
eg: A 1.0-B1.0-C1.0:我们只需要导入A依赖:它就自动完成导入A,B,C依赖

2.依赖传递的好处:
   1:减少重复依赖:eg:只需要导入1个即可
   2:自动管理依赖:导入一个依赖,它会自动下载所需要的全部依赖。
   3.!!!确保版本正确(eg:abc三个依赖直接相互兼容)

(2)依赖冲突(是好事)

1.:当发生“ 重复依赖 ”导入时,maven会终止依赖的传递,来避免“ 重复依赖 ”和“ 循环依赖 ”
  eg: a->b->c
      a-<-b<-c  :进入了一个依赖死循环:a依赖b,b依赖c之后,c又依赖b..会及时终止依赖传递
 
2.依赖冲突发生的背景:重复依赖!!
3.依赖冲突解决原则:
  第一原则:谁短谁优先! 引用路径长度
       eg:A - C- B1.0
          F - B2.0
          分析:首先:A、C、F依赖肯定会导入;
                     之后会导入:B2.0:因为B2.0的路径比B1.0短
   第二原则:谁上谁优先():在dependencies 标签中声明的先后顺序; 
             <dependencies>
                 A - B 1.0
                 F -B 2.0  
             </dependencies>
          分析:两个引用路径一样长
               但是   A - B 1.0先声明:所以会导入:A ,B1.0,F
                     
依赖冲突案例:
前提(依赖关系):
   A 1.1 -> B 1.1 -> C 1.1 
   F 2.2 -> B 2.2 
   
pom声明:
   F 2.2
   A 1.1 
   B 2.2 
   
  分析:在pom中声明了 F 2.2,A 1.1 ,B 2.2 ;所以肯定会导入 F2.2,A1.1,B2.2
        因为已经导入了B2.2, 所以就会导入B 1.1了,
        而且 不会导入C 1.1了:因为B1.1发生冲突了,后续都不引用了。
        
     注意:只要发生冲突,其后续的依赖都不会导入!!!

7.maven核心功能2--构建管理(构建动作)

1.构建概念:将java源代码通过一系列过程变成可部署的应用程序的过程
2.构建动作分!!!为:
   maven 工程的本地部署:通常分为:清理、编译、测试、报告、打包、部署(部署必须是jar包形式)
                                clean compile test site  package install/deploy
   
  方法1:通过terminal(alt+f12):1:进入项目的跟路径(项目名称):mvn . \maven-pom-build-o5\
                                 2.输入相关命令触发相应的插件来进行部署:mvn clean/compile/test/package/install
  方法2:通过可视化工具:右侧工具栏Maven-找到进行的项目-生命周期--选择即可
  
  
3.构建命令周期:如果触发周期后的命令,会自动触发该该命令之前的命令
     eg:我们直接相要打包:直接执行mvn package即可,不需要mvn compile test package install/deploy
         因为会自动触发packagepackage前面的命令!!!
         
   (2) 作用:简化构建过程!!!
   
   (3)构建生命周期 分为三个阶段/周期:
            清理周期:clean
            构建周期:compile test package install/deploy
            报告周期:site
        
   (4)演示:
           打包:mvn clean package
           重新编译: mvn clean compile
           本地部署: mvn clean insatll
          
原理图:一个周期 包含多个有序的命令 , 一个命令 对应多个插件
      !周期--包含若干命令--包含活干插件
       真正的构建工具是:底层的插件;  我们使用的周期来进行构建;(底层是调用插件);  --->方便
       

转存失败,建议直接上传图片文件

8.Maven的另外两大特性**:

(1)maven继承

1.maven工程继承关系:

1.maven继承:比如我们在一个maven工程中写好版本version,其它maven工程直接继承这个父类maven工程,方便管理字工程的版本信息,且规范。
2.
父工程:主要来作配置的继承信息。使子过程继承父工程的配置信息!!!
       在父工程中一般不写代码,只做配置的传递。且父工程的打包方式为pom(代表不打包,不写代码)

3.操作过程:直接在父类maven项目右击创建新模块:默认为创建的新模块为其子类
在父工程的pom文件中书写:
  <!--声明版本信息: -->
  
    <!--导入依赖! 此处导入,所有的字工程都有相应的依赖!-->
    <dependencies></dependencies>

    <!--声明依赖,不会下载依赖! 可子以被工程继承版本号:
    比如我们声明jackson-core依赖,书写完之后,子工程shop-order和shop-user并没有导入依赖,只是继承了版本号v。之后我们比如在shop-user子工程
    中导入依赖书写配置信息时:只需要写 g,a,就不需要写v版本号了,因为已经继承了父工程    -->
    <dependencyManagement>

        <dependencies>
    
            <dependency>
            <!--在里面插入所需依赖版本号-->
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-core</artifactId>
                    <version>2.15.2</version>
            </dependency>
    
        </dependencies>

    </dependencyManagement>
    
  之后比如我们想要在子工程shop-user中导入jackson-core依赖:即在其pom文件中只需要书写该依赖的:g,a即可,而v版本号是继承父类的!!!!
  
  

(2)maven聚合

1.聚合概念:
Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!
(这时只需要构建父工程即可,他会自动触发子工程的构建!!)

2.聚合好处:
     1. 统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
     2. 优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
    
 3.
    <modules>
        <module>shop-user</module>
        <module>shop-order</module>
    </modules> 
    注意:a:<!--modules:要统一管理哪些子工程的artifactId-->
          当我们构建父工程时,其下面的子工程也会一并构建;
          b:比如我们删除   <module>shop-order</module>,之后当我们构建父工程时,就只有shop-user字工程构建了
!!!一般情况下:继承和聚合是同时出现!!!
    继承:在父工程中统一声明版本信息version,使用<independencies>和<dependencyManagement> 标签   
          在子工程中使用<parent>标签来指定父工程
             是依赖管理的简化
    聚合:通过父工程统一构建子工程:会统一构建且优化构建顺序。 。
          在父工程中使用modules指定要聚合管理哪些子工程
              是构建管理的简化

9.maven-项目实战

分析:
   1.由图知:是继承和聚合的关系
   2.创建项目工程:我们创建一个父工程:删掉src,打包方式为pom;让父工程做依赖的版本管理
     创建三个子工程:记得转为web项目!!
   3.导入依赖:
     A:先在父工程中声明依赖!!!
   (1)三个子工程的版本号相同都是:1.0.1;
        方法1:在父工程中<dependencyManagement>中声明版本信息version,
        父工程:<dependencyManagement>
                   <>
               <dependencyManagement>
        方法2:在每个子工程中加一个<version>1.0.2</version>即可
   (2)三个子工程中的 依赖的版本号 :在父工程中声明依赖的版本号;
     a:在父工程pom文件中的 properties标签中声明变量:来声明依赖的版本
   	 b:然后在<dependencyManagement>引用!!!(<dependencyManagement>声明依赖,不会下载依赖! 可子以被工程继承版本号)
          注意:依赖的传递:就只需要导入1个依赖即可!gmmmmmmmm!:发现只需要声明4个依赖即可!!!
   4.之后:在每个子工程中导入对应具体的依赖即可
         使用<dependencies> 
         
              <dependency>
                 依赖1的g、a、v;(不用写版本号v,继承父类的版本)
              <dependency>  cl 
              
                <dependency>
                 依赖2的g、a、v;(不用写版本号v,继承父类的版本)
              <dependency>
              
            <dependencies>