SSM - Springboot - MyBatis-Plus 全栈体系(二)

第一章 Maven

三、Maven 核心功能依赖和构建管理

1. 依赖管理和配置

  • Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。
  • 我们通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven 仓库自动下载和管理依赖,从而避免了手动下载和管理依赖的繁琐工作和可能引发的版本冲突问题。
  • 重点: 编写pom.xml文件!
  • maven项目信息属性配置和读取:

<modelVersion>4.0.0modelVersion>

<groupId>com.companyname.project-groupgroupId>

<artifactId>projectartifactId>

<version>1.0.0version>


<packaging>jar/pom/warpackaging>
  • 依赖管理和添加:

<dependencies>
    
    <dependency>
        <groupId>log4jgroupId>
        <artifactId>log4jartifactId>
        <version>1.2.17version>
        
        <scope>runtimescope>
    dependency>

dependencies>
  • 依赖版本提取和维护:

<properties>
  
  <junit.version>4.11junit.version>
  
  <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
properties>

<dependencies>
  <dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    
    <version>${junit.version}version>
  dependency>
dependencies>

2. 依赖传递和冲突

  • 依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B,而 B 又依赖于模块或库 C,那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。当我们引入一个库或框架时,构建工具(如 Maven、Gradle)会自动解析和加载其所有的直接和间接依赖,确保这些依赖都可用。
  • 依赖传递的作用是:
    • 减少重复依赖:当多个项目依赖同一个库时,Maven 可以自动下载并且只下载一次该库。这样可以减少项目的构建时间和磁盘空间。
    • 自动管理依赖: Maven 可以自动管理依赖项,使用依赖传递,简化了依赖项的管理,使项目构建更加可靠和一致。
    • 确保依赖版本正确性:通过依赖传递的依赖,之间都不会存在版本兼容性问题,确实依赖的版本正确性!
  • 依赖传递演示:
    • 项目中,需要导入jackson相关的依赖,通过之前导入经验,jackson需要导入三个依赖,分别为:
      SSM - Springboot - MyBatis-Plus 全栈体系(二)_第1张图片
    • 通过查看网站介绍的依赖传递特性:data-bind中,依赖其他两个依赖
      SSM - Springboot - MyBatis-Plus 全栈体系(二)_第2张图片
    • 最佳导入:直接可以导入data-bind,自动依赖传递需要的依赖
      
      <dependency>
          <groupId>com.fasterxml.jackson.coregroupId>
          <artifactId>jackson-databindartifactId>
          <version>2.15.0version>
      dependency>
      
  • 依赖冲突演示:
    • 当直接引用或者间接引用出现了相同的jar包! 这时呢,一个项目就会出现相同的重复jar包,这就算作冲突!依赖冲突避免出现重复依赖,并且终止依赖传递!
      SSM - Springboot - MyBatis-Plus 全栈体系(二)_第3张图片
    • maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决的冲突的方式,不过不推荐!
  • 解决依赖冲突(如何选择重复依赖)方式:自动选择原则
    • 短路优先原则(第一原则)

      • A—>B—>C—>D—>E—>X(version 0.0.1)

      • A—>F—>X(version 0.0.2)

      • 则A依赖于X(version 0.0.2)

    • 依赖路径长度相同情况下,则“先声明优先”(第二原则)

      • A—>E—>X(version 0.0.1)

      • A—>F—>X(version 0.0.2)

      • 中,先声明的,路径相同,会优先选择!

前提:
   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 

3. 依赖导入失败场景和解决方案

  • 在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:

    • 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。
    • 依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。
    • 本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项,并且也无法重新下载!
  • 解决方案:

    • 检查网络连接和 Maven 仓库服务器状态。
    • 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。
    • 清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!
    • 例如: pom.xml依赖
    <dependency>
      <groupId>com.alibabagroupId>
      <artifactId>druidartifactId>
      <version>1.2.8version>
    dependency>
    

    SSM - Springboot - MyBatis-Plus 全栈体系(二)_第4张图片

4. 扩展构建管理和插件配置

  • 构建概念:
    • 项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。

SSM - Springboot - MyBatis-Plus 全栈体系(二)_第5张图片

  • 主动触发场景:
    • 重新编译 : 编译不充分, 部分文件没有被编译!
    • 打包 : 独立部署到外部服务器软件,打包部署
    • 部署本地或者私服仓库 : maven工程加入到本地或者私服仓库,供其他工程使用
  • 命令方式构建:
    • 语法: mvn 构建命令 构建命令…
命令 描述
mvn clean 清理编译或打包后的项目结构,删除target文件夹
mvn compile 编译项目,生成target文件
mvn test 执行测试源码 (测试)
mvn site 生成一个项目依赖信息的展示页面
mvn package 打包项目,生成war / jar 文件
mvn install 打包后上传到maven本地仓库(本地部署)
mvn deploy 只打包,上传到maven私服仓库(私服部署)
  • 可视化方式构建
    SSM - Springboot - MyBatis-Plus 全栈体系(二)_第6张图片
  • 构建命令周期:
    • 构建生命周期可以理解成是一组固定构建命令的有序集合,触发周期后的命令,会自动触发周期前的命令!也是一种简化构建的思路!

    • 清理周期:主要是对项目编译生成文件进行清理

      • 包含命令:clean
    • 默认周期:定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分

      • 包含命令:compile - test - package - install / deploy
    • 报告周期

      • 包含命令:site
    • 打包: mvn clean package 本地仓库: mvn clean install

  • 最佳使用方案:
打包: mvn clean package
重新编译: mvn clean compile
本地部署: mvn clean install 
  • 周期,命令和插件:

    • 周期→包含若干命令→包含若干插件!

    • 使用周期命令构建,简化构建过程!

    • 最终进行构建的是插件!

    • 插件配置:

<build>
   
    <plugins>
        <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-war-pluginartifactId>
            <version>3.2.2version>
        plugin>
    plugins>
build>

四、Maven 继承和聚合特性

1. Maven 工程继承关系

1.1 继承概念

  • Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。
    SSM - Springboot - MyBatis-Plus 全栈体系(二)_第7张图片

1.2 继承作用

  • 作用:在父工程中统一管理项目中的依赖信息,进行统一版本管理!

  • 它的背景是:

    • 对一个比较大型的项目进行了模块拆分。
    • 一个 project 下面,创建了很多个 module。
    • 每一个 module 都需要配置自己的依赖信息。
  • 它背后的需求是:

    • 多个模块要使用同一个框架,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一管理。
    • 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。
  • 通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。

1.3 继承语法

  • 父工程
<groupId>com.alex.mavengroupId>
<artifactId>pro03-maven-parentartifactId>
<version>1.0-SNAPSHOTversion>

<packaging>pompackaging>
  • 子工程

<parent>
  
  <groupId>com.alex.mavengroupId>
  <artifactId>pro03-maven-parentartifactId>
  <version>1.0-SNAPSHOTversion>
parent>




<artifactId>pro04-maven-moduleartifactId>

1.4 父工程依赖统一管理

  • 父工程声明版本


<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-coreartifactId>
      <version>4.0.0.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-beansartifactId>
      <version>4.0.0.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-contextartifactId>
      <version>4.0.0.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-expressionartifactId>
      <version>4.0.0.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-aopartifactId>
      <version>4.0.0.RELEASEversion>
    dependency>
  dependencies>
dependencyManagement>
  • 子工程引用版本



<dependencies>
  <dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-coreartifactId>
  dependency>
  <dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-beansartifactId>
  dependency>
  <dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-contextartifactId>
  dependency>
  <dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-expressionartifactId>
  dependency>
  <dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-aopartifactId>
  dependency>
dependencies>

2. Maven 工程聚合关系

2.1 聚合概念

  • Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!

2.2 聚合作用

  • 统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
  • 优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。

2.3 聚合语法

  • 父项目中包含的子项目列表。
<project>
  <groupId>com.examplegroupId>
  <artifactId>parent-projectartifactId>
  <packaging>pompackaging>
  <version>1.0.0version>
  <modules>
    <module>child-project1module>
    <module>child-project2module>
  modules>
project>

2.4 聚合演示

  • 通过触发父工程构建命令、引发所有子模块构建!产生反应堆!
    SSM - Springboot - MyBatis-Plus 全栈体系(二)_第8张图片

五、Maven 实战案例:搭建微服务 Maven 工程架构

1. 项目需求和结构分析

SSM - Springboot - MyBatis-Plus 全栈体系(二)_第9张图片

  • 需求案例:搭建一个电商平台项目,该平台包括用户服务、订单服务、通用工具模块等。

  • 项目架构:

    • 用户服务:负责处理用户相关的逻辑,例如用户信息的管理、用户注册、登录等。
    • 订单服务:负责处理订单相关的逻辑,例如订单的创建、订单支付、退货、订单查看等。
    • 通用模块:负责存储其他服务需要通用工具类,其他服务依赖此模块。
  • 服务依赖:

    • 用户服务 (1.0.1)
      • spring-context 6.0.6
      • spring-core 6.0.6
      • spring-beans 6.0.6
      • jackson-databind / jackson-core / jackson-annotations 2.15.0
    • 订单服务 (1.0.1)
      • shiro-core 1.10.1
      • spring-context 6.0.6
      • spring-core 6.0.6
      • spring-beans 6.0.6
    • 通用模块 (1.0.1)
      • commons-io 2.11.0

2. 项目搭建和统一构建

2.1 父模块搭建 (micro-shop)

2.1.1 创建父工程

SSM - Springboot - MyBatis-Plus 全栈体系(二)_第10张图片

2.1.2 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.0modelVersion>

    <groupId>com.alexgroupId>
    <artifactId>micro-shopartifactId>
    <version>1.0.1version>
    
    <packaging>pompackaging>

    <properties>
        <spring.version>6.0.6spring.version>
        <jackson.version>2.15.0jackson.version>
        <shiro.version>1.10.1shiro.version>
        <commons.version>2.11.0commons.version>
        <maven.compiler.source>17maven.compiler.source>
        <maven.compiler.target>17maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    
    <dependencyManagement>
        <dependencies>
            
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-contextartifactId>
                <version>${spring.version}version>
            dependency>

            
            <dependency>
                <groupId>com.fasterxml.jackson.coregroupId>
                <artifactId>jackson-databindartifactId>
                <version>${jackson.version}version>
            dependency>

            
            <dependency>
                <groupId>org.apache.shirogroupId>
                <artifactId>shiro-coreartifactId>
                <version>${shiro.version}version>
            dependency>
            
            <dependency>
                <groupId>commons-iogroupId>
                <artifactId>commons-ioartifactId>
                <version>${commons.version}version>
            dependency>

        dependencies>

    dependencyManagement>

    <dependencies>
        
    dependencies>

    
    <build>
        
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-war-pluginartifactId>
                <version>3.2.2version>
            plugin>
        plugins>
    build>

project>

2.2 通用模块 (common-service)

2.2.1 创建模块

SSM - Springboot - MyBatis-Plus 全栈体系(二)_第11张图片
SSM - Springboot - MyBatis-Plus 全栈体系(二)_第12张图片

2.2.2 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.0modelVersion>
    <parent>
        <groupId>com.alexgroupId>
        <artifactId>micro-shopartifactId>
        <version>1.0.1version>
    parent>
    <artifactId>common-serviceartifactId>
    
    <packaging>jarpackaging>

    <properties>
        <maven.compiler.source>17maven.compiler.source>
        <maven.compiler.target>17maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    <dependencies>
        
        <dependency>
            <groupId>commons-iogroupId>
            <artifactId>commons-ioartifactId>
        dependency>
    dependencies>

project>

2.3 用户模块 (user-service)

2.3.1 创建模块

SSM - Springboot - MyBatis-Plus 全栈体系(二)_第13张图片

SSM - Springboot - MyBatis-Plus 全栈体系(二)_第14张图片

2.3.2 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.0modelVersion>  
  <parent> 
    <groupId>com.alexgroupId>  
    <artifactId>micro-shopartifactId>  
    <version>1.0.1version> 
  parent>  
  <artifactId>user-serviceartifactId>  
  <packaging>warpackaging>

  <properties> 
    <maven.compiler.source>17maven.compiler.source>  
    <maven.compiler.target>17maven.compiler.target>  
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> 
  properties>

  <dependencies>
    
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-contextartifactId>
    dependency>

    
    <dependency>
      <groupId>com.fasterxml.jackson.coregroupId>
      <artifactId>jackson-databindartifactId>
    dependency>
  dependencies>
project>

2.4 订单模块 (order-service)

2.4.1 创建模块

SSM - Springboot - MyBatis-Plus 全栈体系(二)_第15张图片

SSM - Springboot - MyBatis-Plus 全栈体系(二)_第16张图片

2.4.2 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.0modelVersion>
    <parent>
        <groupId>com.alexgroupId>
        <artifactId>micro-shopartifactId>
        <version>1.0.1version>
    parent>

    <artifactId>order-serviceartifactId>
    <packaging>warpackaging>

    <properties>
        <maven.compiler.source>17maven.compiler.source>
        <maven.compiler.target>17maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    <dependencies>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
        dependency>

        
        <dependency>
            <groupId>org.apache.shirogroupId>
            <artifactId>shiro-coreartifactId>
        dependency>
    dependencies>

project>

六、Maven 核心掌握总结

核心点 掌握
安装 maven安装、环境变量、maven配置文件修改
工程创建 gavp属性理解、JavaSE/EE工程创建、项目结构
依赖管理 依赖添加、依赖传递、版本提取、导入依赖错误解决
构建管理 构建过程、构建场景、构建周期等
继承和聚合 理解继承和聚合作用、继承语法和实践、聚合语法和实践

你可能感兴趣的:(SSM+全栈体系,maven)