初步了解Java的包管理与Maven

什么是包

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实战》
坐标和依赖
仓库
生命周期
聚合和继承

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容