Maven的依赖与最佳配置(转载自Maven实战 作者许晓斌)
1、依赖的配置
依赖配置的属性:
<dependencies><dependency><groupId>...</groupId><artifactId>...</artifactId><version>...</version><type>...</type><scope>...</scope><optional>...</optional><exclusions><exclusion>...</exclusion></exclusions></dependency></dependencies>
- groupId、artifactId和Version:依赖的基本坐标,Maven根据坐标找到相应的依赖。
- type:依赖的类型,对应于项目坐标定义的packaging。默认为jar
- scope:依赖的范围
- optional:标记依赖的可选性
- exclusions:用来排出传递性的依赖
2、依赖的范围
maven有六种依赖范围compile、test、provided、runtime、system和import(Maven2.0.9及以上)
- compile:编译依赖范围。默认配置。对于编译、测试和运行的classpath都有效。
- test:测试依赖范围。对于测试的classpath有效。例如JUnit
- provided:已提供依赖范围。对于编译、测试有效。运行时无效。如servlet-api,编译测试的时候需要但是运行时在服务器提供,就不需要了。
- runtime:运行时依赖。对于测试和运行有效。编译无效。
- system:系统范围依赖。与provide几乎一致。
<dependency><groupId>javax.sql</groupId><artifactId>jdbc-stdext</artifactId><version>2.0</version><scope>system</scope><systemPath>${java.home}/lib/rt.jar</systemPath> </dependency>
- import:导入依赖范围。不对三种classpath有影响。
3、传递性依赖
一个基于Spring Framework的项目,如果不适用Maven,在项目中就需要手动下载依赖。而Spring Framework又依赖其他的开源类库,所以还要下载别的jar包。Maven的传递依赖机制可以解决这个问题。Maven会解析各个直接依赖的POM,将那些必要的简介依赖以传递依赖的形式引入到当前的项目中。
compile | test | provided | runtime | |
compile | compile | -- | -- | runtime |
test | test | -- | -- | test |
provided | provided | -- | provided | provided |
runtime | runtime | -- | -- | runtime |
可以看到当第二直接依赖范围是compile时,传递依赖的范围与第一依赖相同;当第二直接依赖范围是test时,依赖不会传递;当第二直接依赖是provided时,只有第一直接依赖是provided时,传递依赖才是provided;当第二直接依赖的范围是runtime时,传递依赖范围与第一依赖相同,出了compile的范围,这时候传递依赖为runtime。
4、依赖的调解
当依赖传递造成问题时,我们需要清楚地知道该传递性依赖的路径。依赖调解的第一原则是:路径最近着优先。例如项目A有这样的依赖关系:A-->B-->C--X(1.0) A--D--X(2.0),其中X(1.0)的路径长度为3,而X(2.0)的长度为2,因此X(2.0)会被解析使用。
当第一条原则不能解决问题时,使用依赖调解的第二原则:第一声明优先。如A-->B-->Y(1.0) A-->C--Y(2.0)此时依靠第一原则无法判断,这是后在POM中依赖的声明顺序决定了谁会被解析使用。顺序最靠前的会被解析。
5、可选依赖
有一个项目实现了两个特性,其中一个特性依赖与X,另一个特性依赖与Y,而这两个特性是互斥的,用户不可能同时使用两个特性。那么在依赖属性中添加Optional元素。表名为可选依赖。只会对当前项目有影响,而不会传递。
6、最佳实现
1、排除依赖
传递性依赖会给项目隐式的引入很多依赖,这简化了项目依赖的管理。有时候也会带来问题。当一个项目有第三方依赖,而这个第三方依赖引用了一个类库的SNAPSHOT版本,而这个依赖会传递到项目中。造成项目的不稳定性。或者引用的类库不在Maven的中央类库中。我们想把这种有危害的依赖踢出。可以使用exclusion元素:
<dependency><groupId>...</groupId><artifactId>...</artifactId><version>...</version><exclusions><exclusion><groupId>com.test</groupId><artifactId>project-a</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>com.test</groupId><artifactId>project-a</artifactId><version>1.1.0</version>
</dependency>
这样我们就可以把project-a不稳定的版本踢出,添加一个新的版本1.1.0.。
2、归类依赖
可以在POM文件中增加属性如:
<properties><spring-version>4.1.3.RELEASE</spring-version>
</properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring-version}</version></dependency>
这样当我们要修改版本的时候,只需要修改property的值就可以了。
3、优化依赖
我们可以通过命令查看当前项目已解析的依赖:
mvn dependency:list
[INFO] ------------------------------------------------------------------------
[INFO] Building Account Email 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ account-email ---
[INFO]
[INFO] The following files have been resolved:
[INFO] commons-logging:commons-logging:jar:1.2:compile
[INFO] junit:junit:jar:4.7:test
[INFO] org.springframework:spring-beans:jar:4.1.3.RELEASE:compile
[INFO] org.springframework:spring-expression:jar:4.1.3.RELEASE:compile
[INFO] javax.activation:activation:jar:1.1:compile
[INFO] org.springframework:spring-aop:jar:4.1.3.RELEASE:compile
[INFO] org.springframework:spring-core:jar:4.1.3.RELEASE:compile
[INFO] aopalliance:aopalliance:jar:1.0:compile
[INFO] org.springframework:spring-context:jar:4.1.3.RELEASE:compile
[INFO] com.icegreen:greenmail:jar:1.3.1b:compile
[INFO] org.springframework:spring-context-support:jar:4.1.3.RELEASE:compile
[INFO] org.slf4j:slf4j-api:jar:1.3.1:compile
[INFO] javax.mail:mail:jar:1.4.1:compile
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.686 s
[INFO] Finished at: 2014-12-20T14:13:26+08:00
[INFO] Final Memory: 7M/12M
[INFO] ------------------------------------------------------------------------
我们可以看到所有的依赖及其依赖范围。
同时可以使用命令查看以来的结构:
mvn dependency:tree
得出结果如下:
[INFO] ------------------------------------------------------------------------
[INFO] Building Account Email 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ account-email ---
[INFO] com.juven.mvnbook.account:account-email:jar:1.0.0-SNAPSHOT
[INFO] +- org.springframework:spring-core:jar:4.1.3.RELEASE:compile
[INFO] | \- commons-logging:commons-logging:jar:1.2:compile
[INFO] +- org.springframework:spring-beans:jar:4.1.3.RELEASE:compile
[INFO] +- org.springframework:spring-context:jar:4.1.3.RELEASE:compile
[INFO] | +- org.springframework:spring-aop:jar:4.1.3.RELEASE:compile
[INFO] | | \- aopalliance:aopalliance:jar:1.0:compile
[INFO] | \- org.springframework:spring-expression:jar:4.1.3.RELEASE:compile
[INFO] +- org.springframework:spring-context-support:jar:4.1.3.RELEASE:compile
[INFO] +- javax.mail:mail:jar:1.4.1:compile
[INFO] | \- javax.activation:activation:jar:1.1:compile
[INFO] +- junit:junit:jar:4.7:test
[INFO] \- com.icegreen:greenmail:jar:1.3.1b:compile
[INFO] \- org.slf4j:slf4j-api:jar:1.3.1:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.656 s
[INFO] Finished at: 2014-12-20T14:15:52+08:00
[INFO] Final Memory: 6M/12M
[INFO] ------------------------------------------------------------------------
同时可以使用另外一个指令来分析依赖的关系及完整性:
mvn dependency:analyze
结果中指出我们需要的依赖及没有使用的依赖:
[INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) @ account-email ---
[WARNING] Used undeclared dependencies found:
[WARNING] org.springframework:spring-context:jar:4.1.3.RELEASE:compile
[WARNING] Unused declared dependencies found:
[WARNING] org.springframework:spring-core:jar:4.1.3.RELEASE:compile
[WARNING] org.springframework:spring-beans:jar:4.1.3.RELEASE:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.701 s
[INFO] Finished at: 2014-12-20T14:18:28+08:00
[INFO] Final Memory: 7M/13M
[INFO] ------------------------------------------------------------------------
而这种依赖的出错时很难查找的,所以先进性依赖的分析是非常有用的。
Maven的依赖与最佳配置(转载自Maven实战 作者许晓斌)相关推荐
- pom文件依赖范围(来自Maven实战(书籍)-许晓斌)
compile:编译依赖范围.如果没有指定,就会默认使用该依赖范围.使用此依赖范围的Maven依赖,对于编译.测试.运行三种classpath都有效.典型的例子是spring-core,在编译.测试和 ...
- maven snapshot依赖 打包_Maven教程2:Maven项目构建过程练习
点击上方"Java技术前线",选择"置顶或者星标" 与你一起成长 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化 ...
- MyEclipse + Maven开发Web工程的配置
MyEclipse + Maven开发Web工程的配置 1. 使用Maven创建webapp工程----原因是使用Maven时一般需要遵循一定的目录结构,虽然也可以使用不同的目录结构,但目前还不熟悉如 ...
- 一个pom文件中出现了两个相同的依赖_在IDEA里解决maven的pom引用jar包冲突
前言 有的时候,我们要给系统添加一个新功能,可能需要引入新的pom依赖,一切都搞定好后,运行程序却发现报NoClassDeFoundError错误,或者其它莫名奇妙的问题. 这个时候很有可能就是新引入 ...
- maven安装_如何从官网下载Maven与安装Maven
1 打开浏览器,输入http://maven.apache.org/ 2 点击左侧的Download 3 向下滚动页面,点击apache-maven-3.6.0-bin.zip,下载最新的压缩包 4 ...
- 计算机网络详细配置,计算机网络:配置、设计与实战
计算机网络:配置.设计与实战 作者:朱玛 主编 出版日期:2020年01月 文件大小:12.11M 支持设备: ¥30.00在线试读 适用客户端: 言商书局 iPad/iPhone客户端:下载 And ...
- Spring整合Mongodb,Maven的依赖,Spring配置,MongoDB的公共操作类,使用SpringMVC的Controller进行测试并返回结果的案例
在和Spring和MongoDB进行整合的时候需要如下三个jar,分别是: spring-data-commons spring-data-mongodb mongo-java-driver 下面讲解 ...
- CSE 支持spring 4/5 以及spring boot 1/2 maven组件依赖关系配置参考
[摘要] 本文介绍了CSE如何使用Spring 4或者Spring 5,以及在Spring Boot 1和Spring Boot 2中如何集成CSE,重点介绍了CSE提供的maven管理器,以及如何使 ...
- maven asm 依赖配置_Maven教程_v20201119
Maven是什么?它的作用有哪些? Maven安装配置和目录结构详解 创建Maven项目(cmd命令) Maven生成站点和报告文档(cmd命令) 使用MyEclipse建立maven项目 使用MyE ...
- idea安装maven依赖包及配置过程,打开及运行项目
一.idea安装maven依赖包及配置 1.官网下载maven安装包 2.将安装包解压到D盘任意位置,例如D:\ProgramFile\ideaMaven下 3.然后配置环境变量 打开电脑设置→系统→ ...
最新文章
- Data Mining and Machine Learning in Cybersecurity PDF
- WildFly 报错 java.lang.NoClassDefFoundError
- 【必知】国内最设计感的 App推荐
- 潘石屹接连带货 Python,要来抢我们的饭碗?
- 斐波那契数列(二)--矩阵优化算法
- 【软件测试】系统测试
- 婚姻大数据:姐弟恋最靠谱,男同学们,小姐姐会好好爱护你的
- 结合swiper使用图片懒加载
- SpringBoot实战(十):统一异常处理
- mysql多库备份_Mysql 之多库备份
- badboy无法录制 浏览器版本过低请下载最新的Badboy
- 2022 MegCup | 小模型盲降噪怎么比?资深炼丹师给你赛前指导!
- c语言编程计算税后收入,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
- 2019云栖大会归来有感
- TVS(瞬态抑制二极管)、Schottky(肖特基二极管)、Zener (齐纳二极管,也称稳压二极管)主要特点及区别和使用
- L1-027 出租 (20 分) java
- 《Generative Neural Networks for Anomaly Detection in Crowded Scenes》解读
- 2029. 石子游戏 IX(C++解法与思路)
- 如何成为一个Hacker
- Github如何添加合适的开源License(Apache License 2.0、MIT License、GPL3)
热门文章
- 14天精读掌握《陶哲轩:实分析》第11天 2019.7.18
- 【可靠性评估】电力系统可靠性评估matlab仿真
- E.03.24 Colin Huang steps down as Pinduoduo chair
- MATLAB 数学应用 初等数学 绘制虚数和复数数据图
- TCP通信协议基本操作
- SQL Server 2019的下载与安装
- 为什么每天那么累?如何让自己精力充沛?
- 专题详解-5G接入控制(1)
- 计算机应用程序错误怎么解决办法,应用错误,教您怎么解决explorer.exe应用程序错误...
- stm32f103r8t6的晶振频率_STM32F103R8T6