Maven

作者: bowen_wu | 来源:发表于2022-05-23 20:45 被阅读0次

    概述

    maven => Java 世界中最流行的自动化构建工具之一 => 划时代的包管理

    • Convention over Configuration => 约定优于配置
    • Maven 远远不止是包管理
    • Maven 中央仓库 => 按照一定的约定存储包
    • Maven 本地仓库 => 默认位于 ~/.m2 => 下载的第三方包放在这里进行缓存

    特点

    • 生命周期管理
    • 依赖解析
    • 构建自动化

    • jar 包 == 包 => 包就是把许多类放在一起打的压缩包 => 包就是一堆类的集合
    • JVM 工作 => 执行一个类的字节码,这个过程中如果遇到了新的类,加载它

    Search 3th package & Usage

    Key Work => [packageName] maven => 选择最新版本 => select maven => copy code

    3th package Usage 3th package

    Classpath 类路径

    -classpath | -cp => 从 Classpath 里面去寻找相关的类,之后加载它 => 每当 JVM 需要一个类时,就会在当前的 Classpath 里面找,如果碰到 jar 包,就将 jar
    包解压缩,继续在解压缩的目录里面找

    类的全限定类名 FQCN (目录层级)唯一确定了一个类

    源代码中依赖的类还依赖了其他的类 => 传递性依赖

    Classpath Hell 依赖地狱

    • 全限定类名是类的唯一标识
    • 当多个同名类同时出现在 Classpath 中,就是噩梦的开始

    包管理

    包管理的本质

    • 引用第三方库时,需要告知 JVM 去哪里找
    • 告诉 JVM 如何找到所需的第三方类库以及成功地解决其中的冲突问题

    Maven 包

    • 按照约定为所有的包编号,方便检索
    • groupId + artifactId + version
    • scope => 依赖的隔离 => 在不同的代码集合中隔离第三方的依赖
      • <scope>compile</scope> => main + test 可见 => default scope
      • <scope>test</scope> => test 可见,main 不可见
      • <scope>provided</scope> => 只在编译 main 代码时有效,运行时无效 => 运行的时候有其他依赖提供,防止包冲突
    • 传递性依赖的自动管理 => 原则:绝对不允许最终的 classpath 出现同名不同版本的 jar 包
    • 依赖冲突的解决 => 原则:最近的胜出。如果路径相同,先声明的胜出 => 查看依赖🌲 mvn dependency:tree
    • SNAPSHOT 快照版本 => 开发使用的版本

    包冲突

    包冲突相关错误:

    1. AbstractMethodError
    2. NoClassDefFoundError
    3. ClassNotFoundException
    4. LinkageError

    解决包冲突:

    1. 在项目中直接引入想要依赖的包,使得依赖的包最近
    2. 将不想依赖的包告知 maven
      <!-- pom.xml -->
      <dependency>
          <groupId><groupId>
          <artifactId></artifactId>
          <version></version>
          <exclusions> // 取消 groupId 中的依赖
              <exclusion>
                  <groupId></groupId>
                  <artifactId></artifactId>
              </exclusion>
          </exclusions>
      </dependency>
      

    Maven 生命周期

    Maven 生命周期有三种模式:default | clean | site

    Maven Default Lifecycle

    当运行 maven test 时,将会从开始的 validate 执行,直到 test Phase。默认情况下在这些生命周期中,什么都不会做,需要开发者通过 插件(Plugin)
    来指定在某个生命周期要做什么事情

    Maven Plugin

    • Maven Compiler Plugin => 内置,绑定到 compile Phase => 运行到 compile Phase 执行 maven-complier-plugin
      的工作,maven-compiler-plugin 的工作称为goal
    • Maven Surefire Plugin => 内置,绑定到 test Phase,测试插件 => 相关 Plugin 会自动的将 goal 绑定到相关的 Phase
    • Maven Checkstyle Plugin => 第三方插件 => 开发者显示声明该插件的 goal 用于哪个阶段 => 如果遇到两个插件同时绑定到同一个 Phase,运行顺序为声明顺序
      <!-- 将 Maven Checkstyle Plugin 的 goal 绑定到 compile Phase -->
      <executions>
          <execution>
              <id>compile</id>
              <phase>compile</phase>
              <goals>
                  <goal>check</goal>
              </goals>
          </execution>
      </executions>
      

    知识点

    1. pom.xml => project object model
    2. 语义化版本

    相关文章

      网友评论

          本文标题:Maven

          本文链接:https://www.haomeiwen.com/subject/prhdprtx.html