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实战 作者许晓斌)相关推荐

  1. pom文件依赖范围(来自Maven实战(书籍)-许晓斌)

    compile:编译依赖范围.如果没有指定,就会默认使用该依赖范围.使用此依赖范围的Maven依赖,对于编译.测试.运行三种classpath都有效.典型的例子是spring-core,在编译.测试和 ...

  2. maven snapshot依赖 打包_Maven教程2:Maven项目构建过程练习

    点击上方"Java技术前线",选择"置顶或者星标" 与你一起成长 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化 ...

  3. MyEclipse + Maven开发Web工程的配置

    MyEclipse + Maven开发Web工程的配置 1. 使用Maven创建webapp工程----原因是使用Maven时一般需要遵循一定的目录结构,虽然也可以使用不同的目录结构,但目前还不熟悉如 ...

  4. 一个pom文件中出现了两个相同的依赖_在IDEA里解决maven的pom引用jar包冲突

    前言 有的时候,我们要给系统添加一个新功能,可能需要引入新的pom依赖,一切都搞定好后,运行程序却发现报NoClassDeFoundError错误,或者其它莫名奇妙的问题. 这个时候很有可能就是新引入 ...

  5. maven安装_如何从官网下载Maven与安装Maven

    1 打开浏览器,输入http://maven.apache.org/ 2 点击左侧的Download 3 向下滚动页面,点击apache-maven-3.6.0-bin.zip,下载最新的压缩包 4 ...

  6. 计算机网络详细配置,计算机网络:配置、设计与实战

    计算机网络:配置.设计与实战 作者:朱玛 主编 出版日期:2020年01月 文件大小:12.11M 支持设备: ¥30.00在线试读 适用客户端: 言商书局 iPad/iPhone客户端:下载 And ...

  7. Spring整合Mongodb,Maven的依赖,Spring配置,MongoDB的公共操作类,使用SpringMVC的Controller进行测试并返回结果的案例

    在和Spring和MongoDB进行整合的时候需要如下三个jar,分别是: spring-data-commons spring-data-mongodb mongo-java-driver 下面讲解 ...

  8. CSE 支持spring 4/5 以及spring boot 1/2 maven组件依赖关系配置参考

    [摘要] 本文介绍了CSE如何使用Spring 4或者Spring 5,以及在Spring Boot 1和Spring Boot 2中如何集成CSE,重点介绍了CSE提供的maven管理器,以及如何使 ...

  9. maven asm 依赖配置_Maven教程_v20201119

    Maven是什么?它的作用有哪些? Maven安装配置和目录结构详解 创建Maven项目(cmd命令) Maven生成站点和报告文档(cmd命令) 使用MyEclipse建立maven项目 使用MyE ...

  10. idea安装maven依赖包及配置过程,打开及运行项目

    一.idea安装maven依赖包及配置 1.官网下载maven安装包 2.将安装包解压到D盘任意位置,例如D:\ProgramFile\ideaMaven下 3.然后配置环境变量 打开电脑设置→系统→ ...

最新文章

  1. Data Mining and Machine Learning in Cybersecurity PDF
  2. WildFly 报错 java.lang.NoClassDefFoundError
  3. 【必知】国内最设计感的 App推荐
  4. 潘石屹接连带货 Python,要来抢我们的饭碗?
  5. 斐波那契数列(二)--矩阵优化算法
  6. 【软件测试】系统测试
  7. 婚姻大数据:姐弟恋最靠谱,男同学们,小姐姐会好好爱护你的
  8. 结合swiper使用图片懒加载
  9. SpringBoot实战(十):统一异常处理
  10. mysql多库备份_Mysql 之多库备份
  11. badboy无法录制 浏览器版本过低请下载最新的Badboy
  12. 2022 MegCup | 小模型盲降噪怎么比?资深炼丹师给你赛前指导!
  13. c语言编程计算税后收入,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  14. 2019云栖大会归来有感
  15. TVS(瞬态抑制二极管)、Schottky(肖特基二极管)、Zener (齐纳二极管,也称稳压二极管)主要特点及区别和使用
  16. L1-027 出租 (20 分) java
  17. 《Generative Neural Networks for Anomaly Detection in Crowded Scenes》解读
  18. 2029. 石子游戏 IX(C++解法与思路)
  19. 如何成为一个Hacker
  20. Github如何添加合适的开源License(Apache License 2.0、MIT License、GPL3)

热门文章

  1. 14天精读掌握《陶哲轩:实分析》第11天 2019.7.18
  2. 【可靠性评估】电力系统可靠性评估matlab仿真
  3. E.03.24 Colin Huang steps down as Pinduoduo chair
  4. MATLAB 数学应用 初等数学 绘制虚数和复数数据图
  5. TCP通信协议基本操作
  6. SQL Server 2019的下载与安装
  7. 为什么每天那么累?如何让自己精力充沛?
  8. 专题详解-5G接入控制(1)
  9. 计算机应用程序错误怎么解决办法,应用错误,教您怎么解决explorer.exe应用程序错误...
  10. stm32f103r8t6的晶振频率_STM32F103R8T6