maven如何maven去除重复依赖没有使用的依赖

博客分类:
转载请注明出处哈:/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才能找到 ,可以参考寻找构件过程:) ;
maven-02依赖commons-logging-1.1.1;
maven-03工程依赖 commons-logging-1.1.3
3).看下myEclipse或者执行mvn dependency:tree 查看依赖树:
myeclispe:依赖树
4).冲突解决办法:
&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系列文章:
浏览: 58208 次
浏览量:29156
浏览量:13745
浏览量:4918
分享一款代码生成器,拖拽式组件结合流式处理,很容易的访问数据库 ...
请教楼主,maven-aggregate是如何用eclipse ...
好东西,不错,学习了
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'相关文章推荐
使用maven构建工程通常会引入一些相同的包,造成jar版本冲突,需要去除多余的,一般保留版本最新的jar。
在部署运行工程时根据日志信息可以找到一些冲突信息,例如在我本地项目中有一个servlet-...
排除依赖传递性依赖会给项目隐式地引入很多依赖,着极大简化了项目依赖的管理,但是有些时候这种特性也会带来问题。例如,当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另一个类库的SNAPSHO...
大家都知道Maven的优点是依赖管理,特别是前期使用ANT的开发者都有很多感触。最近要开发一个java工程,定的要使用maven,会使用hadoop和hbase的客户端,而引入一个hadoop-cli...
原文地址:/?p=7351
了解可选依赖和排除依赖的功能,能够帮助我们更好的理解依赖是什么、怎样使用、如何工作和何时最适宜应用。...
上篇说到传递依赖,其优点我们有目共睹,其为我们提高了很多效率,减少了很多工作量。但现实是把双刃剑,完美中总会有所不足。Maven的传递依赖给我们带来的点点不足便是:我们本需要依赖的一些jar包,可能通...
大家都知道Maven的优点是依赖管理,特别是前期使用ANT的开发者都有很多感触。最近要开发一个java工程,定的要使用maven,会使用hadoop和hbase的客户端,而引入一个hadoop-cli...
maven如何引入依赖的时候去除其中某个jar包?
转自:/apache-x/p/5674028.html
maven项目,去除jar包中的不想...
解释:就是说项目中要用到某一个jar包,
在Maven1中,需要把依赖所需要的包每个列出。这对于使用类似如Hibernate的用户来说所操的心太多了,而且也不方便。在Maven2中实现了传递依赖,如此对于Hibernate所依赖的包,Mave...
在maven的管理体系中,各个项目组成了一个复杂的关系网,但是每个项目都是平等的,是个没有贵贱高低,众生平等的世界,全球每个项目从理论上来说都可以相互依赖。就是说,你跟开发Spring的大牛们平起平坐...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)博客分类:
这里所用到的MAVEN-PLUGIN是MAVNE-ASSEMBLY-PLUGIN
官方网站是:
1. 添加此PLUGIN到项目的POM.XML中
&artifactId&maven-assembly-plugin&/artifactId&
&configuration&
&manifest&
&mainClass&com.allen.capturewebdata.Main&/mainClass&
&/manifest&
&/archive&
&descriptorRefs&
&descriptorRef&jar-with-dependencies&/descriptorRef&
&/descriptorRefs&
&/configuration&
&/plugins&
如果出现CLASS重名的情况,这时候就要把最新的版本号添加进去即可,
2, 在当前项目下执行mvn assembly:assembly, 执行成功后会在target文件夹下多出一个以-jar-with-dependencies结尾的JAR包. 这个JAR包就包含了项目所依赖的所有JAR的CLASS.
3.如果不希望依赖的JAR包变成CLASS的话,可以修改ASSEMBLY插件.
3.1 找到assembly在本地的地址,一般是c:/users/${your_login_name}/.m2/\org\apache\maven\plugins\maven-assembly-plugin\2.4
3.2 用WINZIP或解压工具打开此目录下的maven-assembly-plugin-2.4.jar, 找到assemblies\jar-with-dependencies.xml
3.3 把里面的UNPACK改成FALSE即可
浏览 95775
浏览: 262086 次
来自: 芜湖
还有屌丝啊
非常好啊......
为什么我执行(生成的不以-jar-with-depend ...
怒赞一个!!!很棒!
关键是,我想mvn package就打包好,请问,怎么做
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'编程经验:Maven找不到依赖的class怎么办?
编程经验:Maven找不到依赖的class怎么办?
maven方便了对项目jar包的引入和管理,但是同时也带来了一些问题:有时候程序编译报错,找不到依赖的包或者类,相信大家在实际开发中遇到过类似的问题。纽扣学院总结了上述问题的出现和解决方法,共分为三个类型:没有引入jar包引入jar包冲突jar包不完整下面针对这三种问题,有一个统一的解决方法,步骤如下:第一步:确定问题类所属的Jar包这种问题常见在我们导入已存在的工程时候,编译时候import那行的红线,如下:第一步:找到这个类属于哪个jar包,有两个网址:/http://search.maven.org我们在http://search.maven.org下搜索完整的包名+类名,但是找不到,网站提示加上fc:前缀,再次搜索,结果如下:通过上面的搜索发现这个类属于spring-webmvc包,下面我们开始第二步,看看是否有引入这个包。第二步:以eclipse为例,查找问题原因打开pom.xml的“Dependency Hierarchy”视图,然后在“filter”框中输入,&webmvc&, 通过搜索结果 来判断问题。第一种情况,没有引入jar包这个是最为简单的,如果filter之后左侧没有相关jar包,说明该jar包没有被引入:解决方法:引入jar把,把对jar包的依赖写入到pom.xml中第二种情况:是否jar包冲突jar包冲突多数不会表现在编译期间,而是表现在项目启动或者运行期,某个类死活报错,你被它折磨的欲仙欲死,那这时候就要考虑是否相关的jar出现了多个,出现多个很多情况下是关联依赖导致的.解决方案需要在Pom.xml排除不需要的jar包。第三种情况:引入的jar包不完整这种情况很奇怪,可以找到所在的jar,也没有冲突,可是编译器就是报错,那这种情况可能就是jar包本身有问题。解决方案:在maven本地仓库中找到jar包,删除,然后在eclipse中 &force update denpendency&,更新依赖。
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
百家号 最近更新:
简介: 静默的风景,一份安逸 的微美
作者最新文章博客分类:
上一个Sprint总结会中,组内有人提出很多需求为什么会变化,这样搞的开发人员多累啊。为什么一开始就不采取最后决定的方式去做,还一定要折腾下呢。恰好最近看了小道消息一篇关于试错的推文,很是感触。
这点上我承认在沟通管理上没有及时发现组内成员的情绪,而且也没充分让开发人员参与到整体设计过程中,让他们缺少对整体的认识,也没很好的调动他们的积极性。
但是,就是在为什么一开始就不采取最后决定的方式去做这点上,我没法赞同的更多了。的确,需求上的改动,是因为经验,或是能力的问题,或是组织环境要求或是,更或是客户有了新的想法。开发人员就觉得你很脑残啊,为什么不早发现,早你干嘛去了。
对于这个问题,首先我觉得不少人混淆了“试错”和“错误”两个事情。而修改功能过程中,都会出现新的问题,而且在代码走查中,发现了很多代码不够健壮,比如通过连接获取信息只获取一次而没有设定超时时间循环获取导致出错,这些都会引入BUG。所以,功能修改的时候发现修改难度过大,那就得先看看自己做的事情是否不够严谨,自己设计的是否不够周全。
有些偏题,回到主题上,每个人也都无法一次就找到正确的方式,乔布斯也是在不断的试错。特别是项目组走的是敏捷开发道路,一般都是简单实现,之后扩展,就是在不断的重构,如果完全拒绝修改、更正。
之所以开发人员会产生误解,主要我觉得是问题反馈的对象的问题。基本上领导、评审人员、客户都是将问题反馈给我,而开发人员又没想去了解这些反馈,甚至在评审会议上打瞌睡觉得事不关己。总之试错是为了让产品更好,能不断进步。如果一个软件完全不用修改,那是因为他没人会去用,没有反馈的问题。
========分割线=========
之前两片基本上把Maven部署和Helloworld的过程以及过程中可能出现的问题都说到了。这篇就来说说Maven的依赖。
依赖类型
Maven会用到的依赖基本就是5种,compile,test,provided,runtime,system
1.compile:编译依赖范围,默认使用该范围。编译、测试、运行都有效
2.test:测试依赖范围。支队测试的classpath有效。例如Junit,greenMail。
3.provided:对编译和测试有效,对运行无效,常用于容器提供了的运行环境。例如servlet-api,容器以提供,所以只需要编译和测试有效即可。
4.runtime:运行时依赖范围。例如jdbc驱动,编译和测试并不需要,只需要使用JDK提供的JDBC接口即可。
5.system:系统依赖范围,依赖Maven仓库意外的依赖。
例如
&dependencies&
&dependency&
&groupId&javax.sql&/groupId&
&artifactId&jdbc-stdext&/artifactId&
&version&2.0&/version&
&scope&system&/scope&
&systemPath&${java.home}/lib/rt.jar&/systemPath&
&/dependency&
&/dependencies&
依赖的传递
项目中,其实经常会出现这种情况,应用了某个Jar包,然后使用时候报错缺少某个类,这就是因为缺少了该jar包所依赖的jar包的原因。例如工程A依赖了,spring-core,spring-core依赖commons-logging,那A依赖spring-core时候依旧传递的依赖了commons-logging。
##传递依赖的范围
假设A依赖B,B依赖C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围,如下图,最左边一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围,中间交叉单元格表示传递性依赖范围。
&& Tables&&&&&
compile&&&&&&
provided&&&&&
------------- :-------------: -----::-------------: --------: compile&&&&&&
compile&&&&&& && X&& &&& X&&&&&&&&&
test&&&&&&&&&
test&&&&&&&&& && X&& &&& X&&&&&&&&& & test&&&
provided&&&&&
provided&&&&& && X&& provided&&&&&& & provided runtime&&&&&&
runtime&&&&&& && X&& &&& X&&&&&&&&& & runtime
注意:X代表不依赖
依赖冲突的调解
有两个原则,第一原则是路径短优先原则,第二原则是先声明者优先
##路径短优先原则
依赖调解的第一原则是:路径最近者优先。
A -&B-&C-&X(1.0)
A -&D-&X(2.0)
这样A会传递性依赖X(2.0)
##先声明者优先原则
赖调解的第二原则是:先声明者优先。
当路径长度相同时候,第一原则已经不能解决问题了,Maven2.0.9以后版本就有了第二原则,声明在先者有效。
A -&C-&X(1.0)
A -&D-&X(2.0)
这样A传递性依赖了X(1.0),因为他是先声明的。
可选依赖
可选依赖不被传递。例如下例,B有一个持久层工具包依赖,他依赖了两种数据库驱动,这两种特性只需要选择一种,这种传递性依赖是不会给传递的,需要在A项目中另外依赖数据库驱动依赖。
&dependency&
&groupId&mysql&/groupId&
&artifactId&mysql-connector-java&/artifactId&
&version&5.1.10&/version&
&option&true&/option&
&/dependency&
&dependency&
&groupId&postgresql&/groupId&
&artifactId&postgresql&/artifactId&
&version&8.4.701.jdbc3&/version&
&option&true&/option&
&/dependency&
正常情况不应该使用可选依赖,可选依赖一般是项目有多个特性,在面向对象设计中单一原则意指一个类应该只有一项职责。
排除依赖
有的时候传递性依赖的依赖包还处于不稳定版本,或者传递性依赖包因为版权问题不存在于中央仓库,这时候需要引入其他等价的依赖包。
所以需要排除依赖,然后自己在配置文件中再引入相应的依赖包。
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-core&/artifactId&
&version&2.5.6&/version&
&exclusions&
&exclusion&
&groupId&commons-logging&/groupId&
&artifactId&commons-logging&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId& commons-logging &/groupId&
&artifactId& commons-logging &/artifactId&
&version&1.1.0&/version&
&/dependency&
归类依赖
有时候,像Spring框架,当更新依赖时候,需要更新一片的依赖关系,这时候一个一个去修改过于麻烦,不如定义一个常量,更新时候手动修改一个就好了。
可以在pom.xml文件中的project标签下,定义
&properties&
&springframework.version&2.5.6&/ springframework.version&
&/ properties&
然后引入依赖时候,在version 中使用 ${ springframework.version }即可。
##依赖列表
mvn dependency:list命令可以列出当前所有依赖(包括直接和传递)的列表,以及范围。
##依赖树
mvn dependency:tree命令可以层次化的列出所有依赖,可以从书中看出依赖传递的关系。
##依赖分析
mvn dependency:analyze命令可以分析当前依赖,包括哪些依赖被import却没引入,哪些引来引入了但是没加入编译。有时候可以用来删除一些没用的依赖,但是不能直接删除,比如sprint-core是Spring的必须依赖,但是会提示没加入编译,但是他又是Spring框架必须的。
Unused declared dependencies 后的内容 : 项目中未使用的,但显示声明的依赖
Used undeclared dependencies 后的内容:项目中使用到的,但是没有显示声明的依赖。
maven这东西搞得有点复杂,个人认为不会长久用Maven的人简直太多太多了
浏览: 19637 次
来自: 厦门
&div class=&quote_title ...
maven这东西搞得有点复杂,个人认为不会长久
好的。谢谢
xml可以用iteye的code元件的。例如
把错别字改一改,代码格式调整下吧。看的不习惯。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 maven 依赖去除class 的文章

 

随机推荐