标签:结构 工具 这就是我 位置 span plugins 定义 引用 问题
Maven 的概念
------- 一种标准的方式来构建项目,明确定义项目的组成部分,一种简便的方法来发布项目信息,以及一种在多个项目中共享JAR包的方法。
Maven 的主要目的是为了开发者提供
1、 一个可复用、可维护、可易理解的工程综合模型与这个模型交互的插件和工具
2、工程结构和内容在一个xml 文件中定义--pom.xml
Maven中jar包的位置
---把查找jar的工作交给机器,因此每一个jar必须能被唯一标识
Maven对依赖的管理
scope的主要依赖关系有:
1.compile: 默认编译依赖范围。被依赖项目在编译、测试、运行都参与。打包的时候需包含进去。
2.test:被依赖项目仅仅参与测试相关的工作,如测试代码的编译、执行等。
3.provided: 被依赖项目对运行期无效,打包的时候不用包进去。
4.runtime:被依赖项目无需参与项目的编译。
jar的依赖传递与冲突
以上过程中,项目Mall依赖的fastJson会有三个版本。而我们的JVM只会接受一个版本的jar包。所以一定会有取舍
maven默认的取舍规则是:
1、路径最短原则:product和customer里的fastjson引用路径较短,路径为两步 ;pay项目里的fastjson引用路径较长,路径为三步。因此pay中的fastjson被淘汰。
2、同路径长度下,谁先声明谁优先: product和customer中的fastjson路径相同,那么就看在pom中是先声明product还是先声明customer,谁先用谁的。
maven依赖冲突和解决:
在上面的依赖传递里,maven根据自己的规则取舍出了一个版本的jar,但是此 jar 版本选择可能会与我们项目预期不符,
例:我们想用的版本是 fastJosn:1.2.30,但是该版本第一时间就被淘汰掉了,
在我们项目中如果用到了该版本特性的话,项目运行就会出错---这就是我们常遇到的 jar包冲突问题。
解决方法一:
根据依赖树(mvn依赖树命令:mvn dependenty:tree)与给出的依赖库寻找差异,或者用idea自带的maven插件也可以看到差异
然后再pom.xml中使用exclusion标签排除多余jar包。
解决方法二:
使用maven helper插件,该插件可以在从idea的Plugins中下载到。下载重启后可在pom.xml文件内容下,会多出一个dependency analyzer窗口,
该窗口内会自动列出当前冲突的文件,右键即可查看依赖处源码或是将该库排除。
标签:结构 工具 这就是我 位置 span plugins 定义 引用 问题
原文地址:https://www.cnblogs.com/Sea-and-fish/p/12493363.html