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