什么是包
JVM的工作
- 执行一个类的字节码
- 假如这个过程中碰到了新的类,则加载新类的字节码
包就是把许多类放在一起打成的压缩包
类路径Classpath
-classpath
或-cp
JVM通过类路径找到需要加载的类
Classpath hell
类的全限定类名(目录层级)唯一确定了一个类
当多个同名类同时出现在Classpath中,就可能出现很麻烦的问题
包管理
包管理的本质就是告诉JVM如何找到所需的第三方类库以及解决其中的冲突问题
Maven
Maven是一个划时代的包管理工具,又远远不止是包管理工具
Maven的中央仓库
按照一定的约定存储包Maven的本地仓库
默认位于~/.m2
下载的第三⽅方包放在这⾥里里进⾏行行缓存Maven的包
按照约定为所有的包编号,方便便检索(三个属性groupId/artifactId/version)
扩展-语义化版本
传递性依赖的自动管理(自动下载引用到的包,以及包引用的包)
包冲突
Maven包管理原则
- 不允许最终的classpath出现同名不不同版本的jar包
- 出现同名包则保留路径层数最短的
常见的包冲突报错
- AbstractMethodError
- NoClassDefFoundError
- ClassNotFoundException
- LinkageError
依赖分析
- IDEA中Maven→dependencies
- IDEA中Maven Helper插件
- 命令行
mvn dependency: tree
展示Maven自动解决冲突之后的依赖树
手动解决包冲突
修改pom.xml
- 根据距离最近优先原则,添加一个依赖,使距离远的同名包不被引用
- 添加exclusions排除不要的包
Maven中的scope
test
只在测试代码中生效
compile
在测试和生产环境中都生效
provided
在编译的时候生效,在运行时不生效
《Maven实战》
坐标和依赖
仓库
生命周期
聚合和继承