转载请注明出处哈:http://yanan0628.iteye.com/blog/2270409
1.maven依赖的几个特性
1.1 依赖范围 -scope标签
maven在构建过程有3套classpath,我们会根据配置依赖的范围 依赖不同的classpath,如下图:
compile:默认是compile,对 编译 测试 运行 都有效
provided:对编译和测试classpath有效,运行的时候不需要加入,例如 jsp 依赖 searvlet api ,比如我们在编译和测试的时候有效但是在运行的时候 容器已经提供servletapi,如果加入会造成冲突
runtime:只在测试和运行时 有效,比较典型的例子 jdbc api,只有在启动代码测试或者运行的时候才会启用
test:只会在测试时有效,比较典型例子 就是junit ,只有再测试的时候 才会启用
1.2 依赖传递
比如我们引入某一个依赖spring-test,依赖传递特性会很方便帮助我们下来它相关的依赖,而不必有时会因为引入jar有问题而烦恼,但是也有弊端,存在一些不必要的依赖,可能会造成冲突。
1.3 依赖排除 -exclusion标签
依赖排除的特性 也是为了解决依赖冲突的一个方法,很方便去除依赖传递过程中不必要的依赖。在下面依赖冲冲突会用到 该标签。
1.4 依赖冲突产生原因
使用maven久了会发现存在依赖冲突的问题,由于依赖的传递特性会引入很多隐式的依赖和现有显示jar版本 所冲突,从而造成版本冲突的问题。要解决这个问题,首先就是要查看pom.xml显式和隐式的依赖类包, 然后通过这个类包树找出我们不想要的依赖类包,手工将其排除在外就可以了。
2.依赖冲突的解决
2.1两个基本原则:
1).短路优先原则
A->B->logback-1.0.jar
A->logback-1.1.jar
2).先声明先优先原则(先解析先引用)
与项目A pom中配置 引用坐标的顺序有关,如果依赖B在C前的话 就优先B,反之...
A->B->logback-1.0.jar
A->C->logback-1.1.jar
2.2 演示两个原则
1).创建三个maven工程
maven-01,maven-02,maven-03
2).三个工程依赖结构:
maven-01依赖 spring-test,maven-02,maven-03 (maven-02/03需要首先提交本地仓库,maven-01才能找到 ,可以参考寻找构件过程:1.3 仓库寻找构件过程) ;
maven-02依赖commons-logging-1.1.1;
maven-03工程依赖 commons-logging-1.1.3
3).看下myEclipse或者执行mvn dependency:tree 查看依赖树:
myeclispe:依赖树
4).冲突解决办法:
4.1 pom配置1:
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>4.2.2.RELEASE</version>
- <!-- 依赖排除 可以排除对commons-logging 的依赖
- <exclusions>
- <exclusion>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- </exclusion>
- </exclusions>
- -->
- </dependency>
- <!-- 添加对maven-02依赖 -->
- <dependency>
- <groupId>com.sohu.train</groupId>
- <artifactId>maven-02</artifactId>
- <version>1.0-SNAPSHORT</version>
- </dependency>
短路优先原则:
maven-01->spring-test->spring-core->commons-loggings-1.2(依赖深度3)
maven-01->maven-02->commons-loggings-1.1.1(依赖深度2)
所以maven01工程依赖的commons-loggings-1.1.1
4.2 pom配置2:
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>4.2.2.RELEASE</version>
- <!-- 依赖排除 -->
- <exclusions>
- <exclusion>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- 添加对maven-03依赖 -->
- <dependency>
- <groupId>com.sohu.train</groupId>
- <artifactId>maven-03</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- <!-- 添加对maven-02依赖 -->
- <dependency>
- <groupId>com.sohu.train</groupId>
- <artifactId>maven-02</artifactId>
- <version>1.0-SNAPSHORT</version>
- </dependency>
先引用先优先的原则:
maven-01->spring-test->spring-core
maven-01->maven-02->commons-logging-1.1.1
maven-01->maven-03->commons-logging-1.1.3
如果pom先依赖maven-02则 依赖commons-logging-1.1.1 依赖;反之,如果pom先依赖maven-03则 依赖commons-logging-1.1.3 依赖
所有文章:
maven系列文章:
相关推荐
springboot 的maven依赖包,含有所有maven依赖,网络不好的可以来下。压缩包3.
主要介绍了maven依赖冲突以及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这是一个简单的maven依赖的小例子
附件为:dubbox2.8.4 maven依赖文件。 使用方法:按照依赖关系,自行创建maven依赖文件夹后,将附件解压至指定文件夹即可使用。 可解决Missing artifact com.alibaba:dubbo:jar:2.8.4 dubbo问题。
maven依赖库,里面含有较为全面的jar包,如果maven无法自动下载依赖库,可手动导入依赖库;该压缩包解压后可以直接在maven项目中指定路径使用。
maven依赖
本插件参考58开源插件MavenManager,采用dependencyManagement方式,一键解决Java开发过程中使用maven作为依赖管理时的jar包依赖冲突问题,相比MavenHelper更加省时省力,jar包版本采用最新版本号原则
Oracle依赖,maven依赖,ojdbc8的依赖
MavenRunHelper插件的作用是帮助用户更轻松地在InteliJ IDEA中运行maven项目,它可以自动配置Maven运行环境,并且可以自动识别 maven项目的依赖关系,从而节省时间和精力。
将开发过程常用的maven依赖汇总下来了,不用每次都去maven仓库查询,可以节省很多时间
Maven类包冲突终极解决小技若干
这是一个maven依赖+继承+聚合的小例子,用来参考和学习maven
jackson2.6.0 jar maven依赖 jackson2.6.0 jar maven依赖jackson2.6.0 jar maven依赖jackson2.6.0 jar maven依赖jackson2.6.0 jar maven依赖
试试 IDEA 解决 Maven 依赖冲突的高能神器
maven依赖冲突插件:idea依赖很多的时候 可以使用插件帮我们快速查看冲突的依赖 并快速的解决依赖
oracle ojdbc8 ojdbc14 maven依赖
doris-1.1.3源码编译broker-maven依赖包repository
SSM基本的Maven依赖文件,测试可用
Geoserver maven 依赖 java