饥人谷java学习笔记
java包管理
什么是包
jvm的工作被设计的相当简单:
执行一个类的字节码
假如在这个过程中碰到新的类,加载它
类路径
-classpath/ -cp
类的全限定类名唯一确定了一个类
包就是把许多类放在一起打的压缩包
传递性依赖
依赖类还依赖了别的类
Classpath hell
全限定类名是类的唯一标识
当java包中有同样的类,在引用时谁在前面引用谁的
当多个同名类出现在一个项目中,就可能会产生冲突
什么是包管理
包管理就是告诉jvn如何找到所需的第三方类库,以及成功的解决冲突问题
• Apache Ant
• ⼿动下载jar包,放在⼀个⽬录中
• 写XML配置,指定编译的源代码⽬录、依赖的jar包、输出 ⽬录等
• 缺点
• 每个⼈都要⾃⼰造⼀套轮⼦
• 依赖的第三⽅类库都需要⼿动下载,费时费⼒
• 假如你的应⽤依赖了⼀万个第三⽅的类库呢?
• 没有解决Classpath地狱的问题
Maven包管理
Convention over configuration
约定优于配置
maven的中央仓库
maven的本地仓库
默认存储在 ~/.m2
下载的第三方包缓存在这
maven的包
- 按照约定为所有包编号,便于查找
- groupId/artifactId/version
语义化版本:z.x.y
z:主版本号<br /> x:次版本号 <br /> y:修订号
``` public static int compare(String version1, String version2) {
// 拆分
String[] version1Arr = version1.split("\\.");
String[] version2Arr = version2.split("\\.");
//版本号转化为数组最大长度为3
for (int i = 0; i < 3; i++) {
// 数组长度不够 0 来填补,否则直接转换为int
int v1 = version1Arr.length > i ? Integer.parseInt(version1Arr[i]) : 0;
int v2 = version2Arr.length > i ? Integer.parseInt(version2Arr[i]) : 0;
// 不相等则比较大小,分出结果:
if (v1 != v2) {
return v1 < v2 ? -1 : 1;
}
}
// 完全相等返回0
return 0;
}
4. 传递性依赖的自动管理
- 原则:绝对不允许最终的Calsspath出现同名不同版本的jar包
5. 依赖冲突的解决
原则:最近的胜出<br />包冲突:<br />表现:<br />AbstractMethodError<br />NoClassDefFoundError<br />ClassNotFoundException<br />LimkageError <br />解决:<br />mvn dependency:tree <br /> 用此命令通过命令行查看依赖树或者直接看maven窗口里的依赖<br />查看不同版本依赖库的区别:<br />查看源码中不同<br />1.强行直接引入要的版本<br />2.通过在该依赖下的exclusion强行排除依赖下不需要的依赖
6. 依赖的scope
<a name="h1iIO"></a>
# maven的其他知识
test:只能在test中使用
compile:在main和test中都能使用
provided:只在编译main代码时有效,运行时无效
《Maven实战》1345678 坐标和依赖/⽣命周期/仓库/聚合和继承