饥人谷java学习笔记

java包管理

什么是包

jvm的工作被设计的相当简单:
执行一个类的字节码
假如在这个过程中碰到新的类,加载它

类路径

-classpath/ -cp
类的全限定类名唯一确定了一个类
包就是把许多类放在一起打的压缩包
传递性依赖
依赖类还依赖了别的类
Classpath hell
全限定类名是类的唯一标识
当java包中有同样的类,在引用时谁在前面引用谁的
当多个同名类出现在一个项目中,就可能会产生冲突

什么是包管理

包管理就是告诉jvn如何找到所需的第三方类库,以及成功的解决冲突问题
• Apache Ant
• ⼿动下载jar包,放在⼀个⽬录中
• 写XML配置,指定编译的源代码⽬录、依赖的jar包、输出 ⽬录等
• 缺点
• 每个⼈都要⾃⼰造⼀套轮⼦
• 依赖的第三⽅类库都需要⼿动下载,费时费⼒
• 假如你的应⽤依赖了⼀万个第三⽅的类库呢?
• 没有解决Classpath地狱的问题

Maven包管理

Convention over configuration
约定优于配置

maven的中央仓库

按照一定的约定存放包

maven的本地仓库

默认存储在 ~/.m2
下载的第三方包缓存在这
maven的包

  1. 按照约定为所有包编号,便于查找
  2. groupId/artifactId/version
  3. 语义化版本:z.x.y

    1. z:主版本号<br /> x:次版本号 <br /> y:修订号

    ``` public static int compare(String version1, String version2) {

  1. // 拆分
  2. String[] version1Arr = version1.split("\\.");
  3. String[] version2Arr = version2.split("\\.");
  4. //版本号转化为数组最大长度为3
  5. for (int i = 0; i < 3; i++) {
  6. // 数组长度不够 0 来填补,否则直接转换为int
  7. int v1 = version1Arr.length > i ? Integer.parseInt(version1Arr[i]) : 0;
  8. int v2 = version2Arr.length > i ? Integer.parseInt(version2Arr[i]) : 0;
  9. // 不相等则比较大小,分出结果:
  10. if (v1 != v2) {
  11. return v1 < v2 ? -1 : 1;
  12. }
  13. }
  14. // 完全相等返回0
  15. return 0;
  16. }
  1. 4. 传递性依赖的自动管理
  2. - 原则:绝对不允许最终的Calsspath出现同名不同版本的jar
  3. 5. 依赖冲突的解决
  4. 原则:最近的胜出<br />包冲突:<br />表现:<br />AbstractMethodError<br />NoClassDefFoundError<br />ClassNotFoundException<br />LimkageError <br />解决:<br />mvn dependency:tree <br /> 用此命令通过命令行查看依赖树或者直接看maven窗口里的依赖<br />查看不同版本依赖库的区别:<br />查看源码中不同<br />1.强行直接引入要的版本<br />2.通过在该依赖下的exclusion强行排除依赖下不需要的依赖

  1. 6. 依赖的scope
  2. <a name="h1iIO"></a>
  3. # maven的其他知识

``` 实现依赖的隔离,表面该依赖的作用域
test:只能在test中使用
compile:在main和test中都能使用
provided:只在编译main代码时有效,运行时无效
《Maven实战》1345678 坐标和依赖/⽣命周期/仓库/聚合和继承