依赖配置

我们先来看一份简单的依赖声明:

<project>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...<artifactId>
<version>...</version>
<type>...</type>
<scope>...</scope>
<optional>...</optional>
<exclusions>
<exclusion>...<exclusion>
...
</exclusions>
</dependency>
...
</dependencies>
...
</project>

可以看到所有依赖都会被放置在dependencies标签中,在dependency中的所有标签都是依赖的配置

  • type:依赖的类型,默认值为jar
  • scope:依赖的范围
  • optional:标记依赖是否可选
  • exclusions:用来排除传递性依赖

配置1依赖范围, scope

classpath

classpath:classpath会告诉java执行环境,在哪些目录下可以找到您所要执行的Java程序所需要的类或包

Maven和classpath

在Maven中会使用三种classpath,分别是编译classpath,测试classpath和运行classpath,所以配置scope指定的依赖范围就是指依赖与classpath的关系。

Maven中的依赖范围

Maven包括以下几种依赖范围:

  • compile:编译依赖范围,默认为此范围,使用此依赖范围对编译,测试,运行三种classpath都有效
  • test: 测试依赖范围,只对测试classpath有效
  • provided:已提供依赖范围,对编译和测试classpath有效,编译和测试的时候需要该依赖,运行时,容器已提供,就不需要重复引入
  • runtime: 运行时依赖范围,对测试和运行classpath有效
  • system:系统依赖范围,依赖范围和provided一致,但使用时必须通过systemPath元素显示指定依赖文件的路径
  • import:导入依赖范围,不会对三种classpath产生实际的影响

配置2传递性依赖,optional与exclusions

什么是传递性依赖?

现在有一个项目,若我们没有使用Maven,那么就需要我们手动下载相关的依赖,而这些依赖在定义时,有的也会有它自己的依赖,假设项目有依赖A,A依赖又依赖于a,依赖A和依赖a的依赖范围都是compile,这时候就称依赖a是项目的传递性依赖。有了传递性依赖,使用一个依赖时就不用考虑他依赖了什么,也不用担心引入了多余的依赖,Maven会解析各个直接依赖的POM,将那些必要的简介依赖,以传递性依赖的形式引入到当前的项目中。

传递性依赖和依赖范围

依赖调节

现有两条传递性依赖,如下:

  1. A->B->C->X(1.0) ,A->D->X(2.0)
  2. A->B->Y(1.0), A->C->Y(2.0)

可以看到两条依赖中,在A的两条依赖路径上都有两个版本的X或Y,显然两个版本都被解析是不对的,会造成依赖重复,那么Maven会选择哪个呢?,根据以上两种情况,Maven制定了如下两种规则:

  • 路径近者优先,也就是在第一条依赖中,会解析X(2.0)
  • 路径长度相同时,第一声明者优先,第二条依赖中,会解析Y(1.0)

可选依赖 optional

可选依赖就是指:A->B,B->X(可选),B->Y(可选),如B是一个持久层隔离工具包,支持多种数据库,构建B时需要多种数据库的驱动程序,但在使用B时,只能选择一种数据库。在编写B的pom.xml时,要在依赖中添加<optional>true</optional>配置。
可选依赖不会被传递,只会对B产生影响,当A依赖于B时,需要在A中显式的声明所依赖的数据库

排除依赖exclusions

A->B->C
A依赖B,B依赖C,若这时我们不想使用B依赖deC,而想自己定义,可以使用exclusions配置

<project>
<groupId>com.xikunqu.project</groupId>
<artifactId>project-A</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>com.xikunqu.project</groupId>
<artifactId>project-B</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>com.xikunqu.project</groupId>
<artifactId>project-C</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.xikunqu.project</groupId>
<artifactId>project-c</artifactId>
<version>1.0.0</version>
</dependency> </dependencies>
</project>

最佳实践

归类依赖

当我们引入了一个项目的多个模块,这些模块的版本还是相同的时,我们可以进行如下定义:

<project>
...
<properties>
<springframework.version>2.5.6</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframe.version}</version>
</dependency>
...
</dependencies>
</project>

优化依赖

  • mvn dependency:list ,查看当前项目的已解析依赖
  • mvn dependency:tree,查看当前项目的依赖数
  • mvn dependency:analyze,帮助分析当前项目的依赖

Maven3-依赖的更多相关文章

  1. Maven - Maven3实战学习笔记(2)坐标和依赖

    1.maven坐标元素 maven坐标元素包括:groupId.artifactId.version.packaging.classifier. classifier:定义输出的附属构件.groupI ...

  2. maven3.2.3+eclipse4.4+JDK1.8+win8.1_64bit环境搭建

    --------------------------------------- 博文作者:迦壹 博客标题:win8.1_64bit+eclipse4.4+maven3.2.3+JDK1.8环境搭建 博 ...

  3. Maven3简介

    Maven3简介 百度百科 maven官网: http:\/\/maven.apache.org\/ Maven下载安装 Maven 下载:http:\/\/maven.apache.org\/dow ...

  4. Maven3路程(六)用Maven创建Spring3 MVC项目

    Maven3路程(六)用Maven创建Spring3 MVC项目 一.      环境 spring-framework-3.2.4.RELEASE jdk1.7.0_11 Maven3.0.5 ec ...

  5. maven3在eclipse3.4.2中创建java web项目

    学习maven时参考的一些的博客地址:http://www.cnblogs.com/fnng/archive/2011/12/16/2290587.htmlhttp://sarin.iteye.com ...

  6. Maven3路程(五)用Maven创建Hibernate项目

    本文将用Maven3.Hibernate3.6.Oracle10g整合,作为例子. 环境清单: 1.Maven3.0.5 2.Hibernate3.6.5 Final 3.JDK1.7.0.11 4. ...

  7. maven3实战之仓库(快照版本)

    maven3实战之仓库(快照版本) ---------- 在Maven的世界中,任何一个项目或者构件都必须有自己的版本.版本的值可能是1.0.0,1.3-alpha-4,2.0,2.1-SNAPSHO ...

  8. maven3常用命令、java项目搭建、web项目搭建详细图解

    http://blog.csdn.net/edward0830ly/article/details/8748986 ------------------------------maven3常用命令-- ...

  9. Maven3.2创建webapp项目过程中问题以及解决方案

    用maven组件来创建web项目,maven的好处一大堆,但是在创建项目的时候问题也很多,诸多不顺,网上找了很多资料,貌似都没能解决问题. 环境:jdk1.7.0_80,eclipse4.4,mave ...

  10. myeclipse2014 安装maven3.3.9和mave配置本地仓库

    昨天晚上发现eclipse下一个aptana JS的编辑插件,就想装到myeclipse下,结果悲剧了,myeclipse每次启动都闪退,虽然最后解决了,但是myeclipse里面的自带插件不知少了好 ...

随机推荐

  1. mysql explain执行详解

    1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询.2).select_type列常见的有:A:simple:表示不 ...

  2. Maven解决NoPluginFoundForPrefixException错误

    Maven解决NoPluginFoundForPrefixException错误方法 错误出现的原因 你指的是一个不存在的插件,如由于错误的前缀. 您使用的是第三方的Maven插件没有部署到中央Mav ...

  3. CentOS7下安装Redis

    一.下载redis wget http://download.redis.io/releases/redis-4.0.6.tar.gz 二.解压 tar -zxvf redis-4.0.6.tar.g ...

  4. Spring Scheduled定时任务报错 java.lang.IllegalStateException: Encountered invalid @Scheduled method 'xxx': For input string: "2S"

    报错信息如下: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ding ...

  5. win10下使用powershell来获取文件MD5的命令

    Get-FileHash 文件路径 -Algorithm MD5| Format-List

  6. @ReequestParam

    @RequestParam:传递参数,即将请求参数区数据映射到功能处理方法的参数上 eg. public String queryUserName(@RequestParam String usern ...

  7. CENTOS7上安装MYSQL5.7.21流程

    1系统约定安装文件下载目录:/data/softwareMysql目录安装位置:/usr/local/mysql数据库保存位置:/data/mysql日志保存位置:/data/log/mysql 2下 ...

  8. jmeter本身的一个bug记录

    1.使用jmeter测http接口 2.断言接口返回的内容是否包含某串文本 3.结果:总是返回断言失败,即使接口返回的内容包含了该文本 接口返回的值为: {"code":" ...

  9. python中split()和split(' ')的区别

    用split(" ")测试: s1 = "we are family"#中间一个空格 s2 = "we are family"#中间两个空格 ...

  10. String工具类

    String工具类 问题描述 MAVEN依赖 代码成果 问题描述 很多时候我们需要对字符串进行很多固定的操作,而这些操作在JDK/JRE中又没有预置,于是我们想到了apache-commons组件,但 ...