Maven
2022-05-23 本文已影响0人
bowen_wu
概述
maven => Java 世界中最流行的自动化构建工具之一 => 划时代的包管理
- Convention over Configuration => 约定优于配置
- Maven 远远不止是包管理
- Maven 中央仓库 => 按照一定的约定存储包
- Maven 本地仓库 => 默认位于
~/.m2
=> 下载的第三方包放在这里进行缓存
特点
- 生命周期管理
- 依赖解析
- 构建自动化
包
-
jar 包 == 包
=> 包就是把许多类放在一起打的压缩包 => 包就是一堆类的集合 - JVM 工作 => 执行一个类的字节码,这个过程中如果遇到了新的类,加载它
Search 3th package & Usage
Key Work => [packageName] maven => 选择最新版本 => select maven => copy code
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 快照版本 => 开发使用的版本
包冲突
包冲突相关错误:
- AbstractMethodError
- NoClassDefFoundError
- ClassNotFoundException
- LinkageError
解决包冲突:
- 在项目中直接引入想要依赖的包,使得依赖的包最近
- 将不想依赖的包告知 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 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>
知识点
- pom.xml => project object model
- 语义化版本