文档章节

Maven 实战 02 依赖

fokYaland
 fokYaland
发布于 2015/06/04 17:27
字数 1309
阅读 11
收藏 0
坐标
maven定义了这样一组规则:世界上任何一个构件都可以使用maven坐标唯一标识,maven坐标的元素包括
groupId       定义当前maven项目隶属的实际项目
artifactId     定义实际项目中的一个maven项目(模块),
version          定义当前所处的版本
packaging     定义项目的打包方式。默认为jar
classifier       该元素用来帮助定义构建输出的一些附属构件,如nexus-index-2.0.0-javadoc.jar中,javadoc即为classifier,附属构建不是项目直接生成的,而是由附加插件帮助生成的

依赖的配置
          <dependency>
                <groupId>....</groupId>
                <artifactId>......</artifactId>
                <version>........</version>
                <type>......</type>
                <scope>....</scope>
                <optional>...</optional>
                <exclusions>
                     ..........
                </exclusions>
          </dependency>

groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,
type:依赖的类型,对于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar
scope:依赖的范围
optional:标记依赖是否可选
exclusions:用来排除传递性依赖

依赖范围:是用来控制依赖与这三种classpath(编译classpath,测试classpath,运行classpath)的关系
compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用该依赖范围,对于编译,测试,运行三种classpath都有效
test:测试依赖范围
provided:已提供依赖范围。使用该依赖范围,对于编译和测试classpath有效,但运行时无效(servlet-api)
runtime:运行时依赖范围。使用该依赖范围,对于测试和运行classpath有效,但是编译时无效(jdbc驱动,编译时只需JDK提供的JDBC接口,运行时需要具体实现类)
system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此依赖不是通过maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,一次谨慎使用。systemPath可以引用环境变量

传递性依赖:account-mail有一个compile范围的spring-core依赖,spring-core有一个compile范围的commons-logging依赖,那么commons-logging就会成为account-mail的compile范围依赖

依赖调解:maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面大部分情况下我们只需要关心项目直接依赖的是什么,而不用考虑这些依赖会引入什么传递性依赖。但有时候,当传递依赖造成问题的时候,我们需要清楚地知道该传递性依赖是从哪条依赖路径引入的
maven依赖调解的两个原则。(1)第一原则是:路径最近者优先。(2)第二原则是:第一声明者优先。在依赖路径长度相等的前提下,在pom依赖声明的顺序决定了谁会解析使用,顺序最靠前的那个依赖优胜
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中依赖声明的顺序决定谁会被解析

传递性依赖给项目隐式地引入了很多依赖,这极大地简化了项目的依赖管理,但是有时候这种特性也会带来问题。比如,当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT的版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会影响到当前项目。这时需要排除该SNAPSHOT,并且在当前项目中声明该类库某个正式发布版本
<dependencies>
       <dependency>
           <groupId>com.juvenxu.mvnbook</groupId>
           <artifactId>project-b</artifactId>
           <version>1.0.0</version>
           <exclusions>
             <exclusion>
                 <groupId>com.juvencu.mvnbook</groupId>
                 <artifactId>project-c</artifactId>
             </exclusion>
           </exclusions>
       </dependency>
       <dependency>
          <groupId>com.juvencu.mvnbook</groupId>
          <artifactId>project-c</artifactId>          
          <version>1.1.0</version>
       </dependency>
   </dependencies>

通过${变量名}来引用
声明一个常量信息,所有用到的地方都用这个常量
    <properties>
    <springversion>2.5.6</springversion>
    <junitversion>2.5.6</junitversion>
    </properties>

   <version> ${springversion}</version>

优化依赖:maven会自动解析所有项目的直接依赖和传递性依赖,并且根据规则正确判断每个依赖的范围。对于一些依赖冲突,也能进行调节,以确保任何一个构件只有唯一的版本在依赖中存在。在这些工作之后,最后得到的那些依赖被称为解析依赖。运行下面两条命令分别可以查看当前项目的已解析依赖。
mvn dependency:list
mvn dependency:tree
使用mvn dependency:list和mvn dependency:tree可以帮助我们详细了解项目中所有依赖的具体信息。在此基础上,还有dependency:analyze工具可以帮助分析当前项目的依赖,但是该工具只会分析编译主代码和测试代码所需要用到的依赖,一些执行测试和运行时需要的依赖它就发现不了。

本文转载自:http://blog.csdn.net/yanliang1/article/details/12112085

fokYaland
粉丝 4
博文 68
码字总数 3062
作品 0
东城
私信 提问
SpringBoot23 分模块开发

1 开发环境说明   JDK:1.8   MAVEN:3.5   IDEA:2017.2.5   SpringBoot:2.0.3.RELEASE 2 创建SpringBoot项目   2.1 项目信息   2.2 添加项目依赖   2.3 修改pom文件    ...

CRUD_Architect
2018/07/26
0
0
搭建maven私仓

公司使用国外maven源很慢,打算使用本地仓库解决依赖问题,这里搭建很简单,直接把全部命令贴上来了,一步步执行即可 maven仓库使用nexus来进行搭建,依赖jdk对应版本,步骤如下 yum -y ins...

chenshifei
2017/03/29
0
0
Maven日常 —— 你应该知道的一二三

以前在日常工作中,使用Maven只是机械的执行Maven clean、Maven install,对其中的原理与过程并无了解,近期阅读了《Maven实战》,对Maven有了更深入的理解。 本篇就针对读书后的理解,对Mav...

青夜之衫
2017/12/05
0
0
Spring Boot 2.0 WebFlux 上手系列课程:快速入门(一)

02:WebFlux 快速入门实践 ## Spring Boot 2.0 spring.io 官网有句醒目的话是: BUILD ANYTHING WITH SPRING BOOT Spring Boot (Boot 顾名思义,是引导的意思)框架是用于简化 Spring 应用从...

泥沙砖瓦浆木匠
2018/04/15
0
0
Maven项目管理工具参考知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaobryant/article/details/73609047 本笔记主要记录关于Maven知识体系的一些Pages和Tips! 一、Maven入门手...

adoryn
2017/06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

texlive安装

Installing to: D:/bin/texlive/texlive/2019Installing [001/307, time/total: ??:??/??:??]: adobemapping [2130k]Installing [002/307, time/total: 00:03/08:57]: ae [84k]Installing......

MtrS
23分钟前
2
0
运维规范

命名规范 发布流程 监控告警 故障定位 状态 日志 监控

以谁为师
今天
2
0
约瑟夫环(报数游戏)java实现

开端 公司组织考试,一拿到考题,就是算法里说的约瑟夫环,仔细想想 以前老师将的都忘了,还是自己琢磨把~ package basic.gzy;import java.util.Iterator;import java.util.LinkedList;...

无极之岚
今天
3
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
今天
3
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部