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。
解决方法:
- 直接在“pom.xml”文件中添加c2包依赖以此方式来覆盖c1包。
- 可以直接在pom.xml中 “因为传递性依赖导入了c1包的” 的dependency标签中添加 exclusions标签。
- 使用 Maven helper插件在指定的 包位置 右键 exclude 。其实质和方法2一样。
图形查看pom.xml导入的依赖包
- idea图形界面显示:最右边的菜单栏中的Maven。
- idea也为我们提供了 Maven helper组件方便查看、去除被覆盖。
- mvn dependency:tree:以树状图的方式显示依赖结构。 或者 mvn dependency:tree > dependencyDetail.txt ,将输出流重定向至dependencyDetail.txt文件中搜索关键字方便寻找查看。
如有错误的地方还望各位网友指出改正。
来源:CSDN
作者:得失之道
链接:https://blog.csdn.net/weixin_44738308/article/details/104193496