文档章节

maven坐标和依赖

 老韭菜
发布于 08/17 02:44
字数 1632
阅读 6
收藏 0

一、maven坐标详解

	<groupId>com.fgt.club</groupId>
	<artifactId>club-common-service-facade</artifactId>
	<version>3.0.0</version>
	<packaging>jar</packaging>

maven的坐标元素说明:

groupId: 依赖的基本坐标之一,用于标识当前maven项目所隶属的实际项目;

artifactId:依赖的基本坐标之一,用于标识groupId定义的实际项目中的一个项目(或模块),一般使用实际项目名作为前缀;

version:依赖的基本坐标之一,用于标识maven项目的版本;

packaging:该元素定义了maven项目的打包方式,打包方式与生成文件的文件扩展名通常是一致的,但并不是绝对。

二、maven依赖的配置

maven的项目依赖是在dependency元素中声明的,我们通过一个例子分析下dependency的组成元素。

		<dependency>
			<groupId>...</groupId>
			<artifactId>...</artifactId>
             <version></version>
             <type>...</type>
             <scope>...</scope>
             <optional>...</optional>
             <exclutions>
               <exclution>
                ...
               </exclution>
               ......
             </exclutions>
		</dependency>

1 - dependency元素的说明:

groupId: 依赖的基本坐标之一,用于标识当前maven项目所隶属的实际项目;

artifactId:依赖的基本坐标之一,用于标识groupId定义的实际项目中的一个项目(或模块),一般使用实际项目名作为前缀;

version:依赖的基本坐标之一,用于标识maven项目的版本;

scope:依赖的范围,用于定义当前maven依赖的在项目中的使用范围,默认为compile(在编译、测试、运行时使用);

optional:标记依赖是否可选,默认为false;

exclutions:用于排除传递性性依赖,子元素节点<exclution>包含dependency元素只是不含版本信息<version>;

2 - 依赖范围

maven在编译、测试、运行项目的时候使用的是不同套的classpath,而依赖范围是用于控制maven依赖与这3种classpath(分别是编译classpath、测试classpath和运行时classpath)的关系,maven中依赖范围时是在dependency的scope元素中定义的以下时不同依赖范围的说明:

compile:编译依赖范围。如果dependency的scope未指定默认使用该依赖范围,使用此依赖范围对编译、测试、运行classpath都有效;

test:测试依赖范围,使用此依赖范围只对测试classpath有效,对于编译和运行classpath均无效,常见的有JUnit单元框架,只在编译测试代码和测试的时候有效;

provided:已提供依赖范围。使用此依赖范围的maven依赖对于编译和测试classpath有效,而对于运行时classpath无效。典型的例子时servlet-api在编译和测试时需要但是运行时由于容器例如tomcat中已经提供因此不需要重复引用;

runtime:运行时依赖。使用此依赖范围的maven依赖对于测试和运行classpath有效但是在编译代码的时候无效,典型例子是jdbc驱动,项目主代码主需要JDK提供的通用JDBC接口与只在运行和测试时才需要实现通用接口的具体JDBC驱动实现;

system:系统范围依赖。该依赖与provided依赖范围一致,不同的地方在于,system范围依赖必须在dependency中额外指定<systemPath>元素显示指定依赖文件的路径;

import:导入依赖范围。该依赖范围不会对三种classpath产生实际影响。

 

3 - 传递性依赖

maven的传递性依赖是指如果在一个maven项目中项目pom文件定义的直接依赖项目A也依赖了另一个项目B那么该项目也间接依赖B,maven会解析项目pom文件中定义的各个直接依赖的pom将所有必要的间接依赖以传递性依赖的方式导入当前项目。依赖范围不仅可以控制依赖与三种classpath的关系而且会对传递性依赖产生影响。例如项目account直接依赖于spring-core,依赖范围是默认compile而spring-core又依赖于common-logging依赖范围也是compile,所以account对于common-logging的依赖范围也是compile,其中account对于spring-core被我们称为第一直接依赖,而spring-core对于common-logging的依赖则被我们称为第二直接依赖以下是依赖范围影响传递性依赖范围的表格,第一列为第一直接依赖,而第一行为第二直接依赖。

  compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

 

4 - 依赖调解

maven引入的传递性依赖机制虽然大大简化和方便了依赖声明大部分情况我们不需要关心项目的传递性依赖是什么,但是当传递性依赖出现问题的时候我们要学会解决它。首先我们要了解maven依赖调解遵循的两条原则:

1)最短路径原则。如果在项目A中存在这样的一条依赖链A->B->C->M(1.0),A-B->M(2.0)那么最终哪个2.0版本的依赖M会被项目A解析使用,因为A->B-M(2.0)的路径长度更短;

2)最先声明原则。当依赖路径长度相同的时候,谁现在POM文件中申明解析使用谁(这里声明的依赖指的是冲突依赖本身或者依赖于它的maven依赖)

常用于依赖调解分析的maven命令:maven dependency:tree

5 - 可选依赖

在maven项目中被声明为可选依赖的依赖不会被传递。假如存在项目A依赖于B,项目B依赖于X和Y,但是X和Y在B中dependency的optional声明中被设置为可选依赖true,那么X,Y依赖不会传递到A,X,Y不会对项目A有任何影响。maven这种特性的使用情况一般是在maven项目需要实现多种特性,且每种特性依赖一套相互互斥的maven依赖,例如一个maven项目实现了于多种数据库的连接操作,不同数据库依赖的数据库驱动均不同因此打包时POM文件的各种数据库驱动的dependency的optional元素必须设置为true,当我们在项目中需要使用某种数据库的时候在引入该项目的基础上再引入对应的数据库驱动就不会有冲突。

 

© 著作权归作者所有

共有 人打赏支持
粉丝 12
博文 64
码字总数 107681
作品 0
杭州
后端工程师
私信 提问
maven(十)依赖的传递

一:依赖的传递 1.创建A,B,C三个maven项目 2.把A进行打包,然后安装到库中 3.然后把A的坐标,拷贝到B的依赖中 <groupId>com.eclipse.maven</groupId> <artifactId>eclipsemaven</artifactId>......

路人丁语
2016/03/25
22
0
Maven基础知识

本人博客文章网址:https://www.peretang.com/basic-knowledge-of-maven/ Maven简介 Maven , 用于Java项目的构建 , 依赖管理 , 项目信息管理的项目管理工具. 是Apache组织旗下的开源项目. Mav...

PereTang
2017/05/09
0
0
Maven依赖进阶

使用maven的程序员都会遇到一个问题,那就是maven依赖冲突的问题,这会导致ClassNotFound或者MethodNotFound这样的异常。其实只要明白maven依赖的根本性的原则就不怕这样的问题了。 一、mav...

Lubby
2016/05/12
1K
8
POM文件配置解析

pom.xml:maven项目的核心,定义了项目的基本信息,用于描述项目如何构建,声明项目的依赖,等等。 下面一步步解析pom.xml文件的相关配置。 如图: project:是pom.xml的根元素,声明了POM相...

皮蛋瘦肉粥里没有粥
2016/03/16
468
1
[Maven实战](8)依赖配置与依赖范围

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50609297 1. 依赖配置 依赖基本配置: 我们之前就遇到了依赖的概念,项目中测试需...

sjf0115
2016/01/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用any-loader封装jQuery的XHR —— 随便写着玩系列

哎,都说没人用JQuery啦,叫你别写这个。 其实我也是好高骛远使用过npm上某个和某个很出名的XHR库,嗯,认识我的人都知道我喜欢喷JQ,以前天天喷,见面第一句,你还用JQ,赶紧丢了吧。但我也...

曾建凯
今天
1
0
聊聊storm的AggregateProcessor的execute及finishBatch方法

序 本文主要研究一下storm的AggregateProcessor的execute及finishBatch方法 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout......

go4it
今天
3
0
大数据教程(7.5)hadoop中内置rpc框架的使用教程

博主上一篇博客分享了hadoop客户端java API的使用,本章节带领小伙伴们一起来体验下hadoop的内置rpc框架。首先,由于hadoop的内置rpc框架的设计目的是为了内部的组件提供rpc访问的功能,并不...

em_aaron
今天
5
0
CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

枫叶云
昨天
3
0
利用ibeetl 实现selectpicker 的三级联动

1. js 直接写在html页面上面,ibeetl 就可以动态地利用后台传上来的model List ,不需要每次点击都要ajax请求后台 2. 使用selectpicker 的时候,除了对selecct option的动态处理后,还需要 $("#...

donald121
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部