问题

maven传递依赖
解决方案
 
前段时间,开发中遇到一个关于maven依赖包的问题:由于业务需要,支付网关对账代码中的slf4j-api包需要更新,原包为1.5.8版本,需要更新到1.6.4版本。如下图:
 
本来应该是件很简单的事情,把pom.xml文件里的依赖项修改下就OK了嘛!可是,打开pom.xml文件才发现,dependency里根本没有slf4j的配置信息。那么,问题来了,这个jar包是怎么引进来的呢?研究了半天也没找到根源,由于还有其他工作,就没有继续研究,临时解决方案为:每次代码部署之后,手动将服务器上的slf4j包更换为高版本……这么做是比较麻烦的,更换完jar包之后需要再次重启程序。
这段时间项目上的事情比较少,于是又想起这个问题,这次一定要解决!
对于maven,只能说是会用,但是研究的比较少。我们知道jar包的引用是在pom.xml文件中体现的,因此对于jar包的问题还要从pom.xml下手。既然pom中没有关于slf4j的dependency项,那这个包会不会是伴随其他jar包引进来的呢?以前打开pom文件,只是修改打开pom.xml选项,直接修改文件,其他几个选项没有看过,今天都看了一下,终于发现了问题所在。打开Dependency Hierarchy选项(依赖树),发现某些jar包下面挂着其他jar包,比如下图,slf4j-api包就挂在gpf-memcached包下。这个就叫做“传递性依赖”,也就是说当我们引入某个jar包时,有时可能会顺带引入其他jar包,虽然这个jar包可能并不是我们想要的。
 
当我们引入第三方jar包的时候,难免会引入传递性依赖,有些时候这是好事,然而有些时候我们不需要其中的一些传递性依赖。比如对账这个项目,我们不想引入传递性依赖slf4j。那么,有没有什么方法可以去掉这种jar包之间的依赖呢?答案是肯定的,通过研究,发现有两种方法可以实现:
1、右击想要去掉的传递依赖包,选择Exclude Maven Atifact...
 
之后,保存pom文件,发现之前的slf4j-api-1.5.8.jar已经不再了!
 
2、后来发现还有一种方法:可以使用exclusions元素声明排除依赖,exclusions可以包含一个或者多个exclusion子元素,因此可以排除一个或者多个传递性依赖。需要注意的是,声明exclusions的时候只需要groupId和artifactId,而不需要version元素,这是因为只需要groupId和artifactId就能唯一定位依赖图中的某个依赖。换句话说,Maven解析后的依赖中,不可能出现groupId和artifactId相同,但是version不同的两个依赖。
xml代码:
<dependency>
<groupId>com.i139.gpf</groupId>
<artifactId>gpf-memcached</artifactId>
<version>1.3</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
 
至此,我们已经顺利清除了并不需要的那个依赖包,下面要做的就是引入正确版本的jar包,其实这个就比较简单了,直接在pom.xml文件里加上对应的dependency项就可以了。这里我重点要讲的jar包依赖范围的问题,也就是dependency里面的scope项。下面,我们先来看下maven的几种依赖范围:
compile: 编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。
test: 测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。
provided: 已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍。
runtime: 运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
system: 系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。
有时为了方便,我们会把一些jar包直接放入项目WEB-INFO/lib文件夹下,如果我们要引入项这些jar包,scope改怎么填写呢?显然应该是system!
 
xml代码:
<dependency>
<groupId>slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.4</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/slf4j-api-1.6.4.jar</systemPath>
</dependency> 

maven项目依赖包问题的更多相关文章

  1. IDEA多模块父子依赖maven项目war包部署

    IDEA多模块父子依赖maven项目war包部署 Posted on 2018-04-25 | In IDEA | | Visitors 286 IDEA全称为IntrlliJ IDEA,它是一款非常 ...

  2. Maven将依赖包、jar/war包及配置文件输出到指定目录

    使用Maven插件将依赖包 jar包 war包及配置文件输出到指定目录 写在前面 ​ 最近遇到一个朋友遇到一个项目需要将 maven 的依赖包和配置文件分开打包然后用脚本执行程序.这样的好处在于可以随 ...

  3. Failed to read artifact descriptor for xxx:jar 的Maven项目jar包依赖配置的问题解决

    在开发的过程中,尤其是新手,我们经常遇到Maven下载依赖jar包的问题,也就是遇到“Failed to read artifact descriptor for xxx:jar”的错误. 对于这种非 ...

  4. 自动配置pom文件,构建maven项目jar包依赖关系,找到jar包运用到jmeter

    首先说下pom文件特别方便的优点: 什么是pom文件? POM(Project Object Model) 是Maven的基础. 它是一个XML文件,包含了Maven用来build项目所需要的项目配置 ...

  5. tomcat没有发布maven项目依赖的本地jar包

    建立springMVC的maven项目,平时使用的jar包都是在pom.xml文件配置依赖关系, maven会自动从仓库中下载,这样使用tomcat部署发布都没有问题.但有时我们需要使用maven仓库 ...

  6. 导出maven项目依赖的jar包

    注意使用mvn命令是需要配置好maven的环境变量 一.导出到自定义目录中 在maven项目下创建lib文件夹,输入以下命令: mvn dependency:copy-dependencies -Do ...

  7. IDEA引MAVEN项目jar包依赖导入问题解决

    Intellj 自动载入Mave依赖的功能很好用,但有时候会碰到问题,导致pom文件修改却没有触发自动重新载入的动作,此时需要手动强制更新依赖. 如下: 1手动删除Project Settings里面 ...

  8. maven项目依赖其他jar包的时候,idea运行没问题,java -jar 报错:java.lang.SecurityException: Invalid signature file digest

    当项目依赖其他jar包的时候,打出的jar包执行出错,抛出这个异常. 原因:因为依赖jar包中的META-INF中有多余的.SF文件与当前jar包冲突, 解决方案 一 在打包前删除依赖jar包的.SF ...

  9. Java全栈程序员之06:IDEA中MAVEN项目依赖及运行

    MAVEN已经成为事实上的企业项目开发中的项目类型.无论是IDEA还是Eclipse,都已经默认支持创建MAVEN项目.严格意义上来说,MAVEN不是一种新的JavaEE项目类型.它凌驾于所以的项目类 ...

随机推荐

  1. 转:走近NoSQL数据库的四大家族

    在目前的企业IT架构中,系统管理员以及DBA都会考虑使用NoSQL数据库来解决RDBMS所不能解决的问题,特别是互联网行业.传统的关系型数据库主要以表(table)的形式来存储数据,而无法应对非结构化 ...

  2. spring定时器的定义

    1.0/5 * * * * ?表示多长时间: 每 5 秒执行一次 七个域从左到右依次是,秒,分,时,日,月,周几,年....最后一个可选.同样是七个域与当前时间匹配的时候则执行... n/m 表示从n ...

  3. Flask中的ORM使用

    前言 ORM拓展 安装 数据库设置 使用 关系 单表操作 建表 应用表结构 CRUD 添加查找操作 更新操作 删除操作 一对多 多对多 总结 前言 最近几天接触了一下Flask,在惊叹于其简洁性的同时 ...

  4. 演示使用Metasploit入侵Android

    文本演示怎么使用Kali Linux入侵Android手机. Kali Linux IP地址:192.168.0.112:接收连接的端口:443. 同一局域网内android手机一部(android ...

  5. php项目,cpu暴增问题查找

    背景: 前几天通过WordPress上线一个应用(前后台部署分离,后台走内网内部使用,前台做了全站缓存对外使用). 今天访问后台应用发现开始报504,一段时间后全部504. 解决方案: 登录容器发现容 ...

  6. 【ACM非算法部分】读入优化

    今天做了ACdream的比赛才知道原来还有读入优化这一说.Orz 读入一个整数的时候这么写: int a; scanf("%d",&a); 和 int a; char c; ...

  7. 洛谷 P2920 [USACO08NOV]时间管理Time Management

    传送门 题目大意: 每个工作有截至时间和耗费时间,n个工作求最小开始时间. 题解: 贪心 从n-1安排,让结束时间尽量的晚. 注意:优先级 cout<<st<0?-1:st;  (X ...

  8. ecmall分页

    在Ecmall的二次开发中,分页是必不可少的.这个系统已经自带了分页功能,下面来看看如何使用这个分页. 下面是一个自定义的类,用于查看订单的详细情况.关键在于get_order_data()这个方法, ...

  9. Linux性能评测工具之一:gprof篇介绍

    转:http://blog.csdn.net/stanjiang2010/article/details/5655143 这些天自己试着对项目作一些压力测试和性能优化,也对用过的测试工具作一些总结,并 ...

  10. JVM介绍(二)

    1 JVM简介 JVM是我们Javaer的最基本功底了,刚开始学Java的时候,一般都是从“Hello World”开始的,然后会写个复杂点class,然后再找一些开源框架,比如Spring,Hibe ...