Maven

泪湿孤枕 提交于 2020-02-07 07:50:47

Maven存在的原因

 以前编写项目需要导入其他人编写的jar包时都是自己手动一个一个的拖到一个文件夹下。而Maven的pom.xml文件就很好的解决了这个问题。

  • jar包实质就是一个“.zip”类型的压缩文件,我们可以将其修改为.zip文件解压。打开解压后的文件夹我们可以发现jar文件夹里面装的就是“.class”文件。
  • JVM就是专门用于运行class文件的。

pom.xml文件常见标签

  • groupId:组号,从意义上来说算是分类。
  • artifactId:项目号,jar包名称。
  • version:版本号。
  • scope:使用范围。 test(测试环境中使用)、compile(编译时使用)、…。
     以上四个标签就是坐标可以唯一标识一个jar包及其使用范围。

Maven导入的jar包运行原理

 要使用Maven电脑肯定的设置本地仓库,本地仓库的jar包是通过idea设置的默认远程中央仓库地址下载下来的。在中央仓库中根据 groupId、artifactId、version作为路径去寻找并下载。本地仓库也是将groupId、artifactId、version作为路径区分jar包。 如图分别是pom图、本地仓库图、Maven默认远程仓库图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
 下载到本地后idea会根据“pom.xml”文件到本地仓库中寻找jar包,当我们运行时 idea会自动的将jar包路径导入运行环境的 “classpath环境变量中”。以便可以运行使用里面的class文件。 如果“scope=test” 时表示jar包只能在测试环境中运行,不是测试环境idea是不会将 jar包的路径存入class环境变量中的。 classpath图
详细使用流程请翻看我前面编写的博客是“命令行命令原理”。 命令行命令原理

使用Maven后带来的问题

 世上没有完美的工具,使用Maven的同时我们也承担着许多风险。这里得扩展一下 “Maven导包是具有传递依赖的”,所谓传递依赖就是当运行某个类时,运行的类依赖了其他类
 举个例子:
  编写一个计算价格方法,那么该方法肯定是依赖了 Java的int、float…变量的。如果Java没有提供int等变量该方法肯定是运行不了的。 这里在说明一下 计算价格不能使用double、float类型 应该是 “BigDecimal类”。这里就不细细说明了,如果有兴趣可以翻看我前面编写的一篇博客。

Maven使用原则

 不允许相同groupId+artifactId 不同版本的jar包出现。即时每个不同版本的jar包都是那一个版本号文件夹区分了的。
 Maven导包原则先导离项目进的包,相同路径长度则分先来后到,先导入了后面就不会导入。
  如下图:
在这里插入图片描述
 问题怎么使用 “c2包”呢?:
 这就是所谓的包冲突。 常见异常有 AbstractMethodErro、NoClassDefFoundErro、ClassNotFoundException、LinkageErro。
 解决方法:

  1. 直接在“pom.xml”文件中添加c2包依赖以此方式来覆盖c1包。
  2. 可以直接在pom.xml中 “因为传递性依赖导入了c1包的” 的dependency标签中添加 exclusions标签。
    在这里插入图片描述
  3. 使用 Maven helper插件在指定的 包位置 右键 exclude 。其实质和方法2一样。
    在这里插入图片描述
     图形查看pom.xml导入的依赖包
  • idea图形界面显示:最右边的菜单栏中的Maven。
  • idea也为我们提供了 Maven helper组件方便查看、去除被覆盖。
  • mvn dependency:tree:以树状图的方式显示依赖结构。 或者 mvn dependency:tree > dependencyDetail.txt ,将输出流重定向至dependencyDetail.txt文件中搜索关键字方便寻找查看。

如有错误的地方还望各位网友指出改正。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!