实用maven笔记二-信息&依赖管理
目前我经历的公司的主要项目管理工具都是maven,maven除了是一个实用的构建工具外,也是一个功能强大的项目管理工具。其管理功能分为信息管理和依赖管理。通过pom.xml文件实现。
信息管理
信息管理主要用于定义当前项目构建的主要信息。
单模块项目
对于单个模块项目,其主要管理元素如下:其中project元素为pom.xml的根元素,groupId+artifactId+version三者合一被称为项目的坐标。

多模块项目
maven除了可以定义单模块的项目外,还可以通过多个pom.xml文件的配置,将多个模块组织成平行结构或父子结构的多模块项目。由于目前接触比较多的是父子结构的多模块项目,此处主要介绍下该结构下的信息管理配置。
父子结构的项目,父模块下一般并无项目代码,只是一个父pom文件用于将多个子模块、多模块依赖、多模块打包组合在一起。一个典型的父pom管理信息配置如下,其中:
packaging值必须为pom,否则项目无法构建;
module的值为子模块相对于父pom的相对目录,用于定位子模块。

子模块的pom配置相对复杂,需配置parent元素,用于指定父pom。例如下图,其中:
parent包含groupId/artifactId/version/relativePath
relativePath表示父pom相对当前pom的项目路径;可不填写,不填时默认值为../pom.xml。该元素用于当子模块构建时,根据该值检查父pom的依赖。

依赖管理
依赖管理用于处理项目模块对库的依赖关系。特别是当一个项目是多模块项目时,通过依赖管理处理依赖冲突变得特别重要。
单模块依赖
模块的依赖,也跟项目的信息一样通过groupId+artifactId+version坐标定义,此外还有些其他元素用于配置一些特殊信息,例如下图

其中:
type类型默认为jar
optional用于标记依赖是否可选
exclusions用于排除传递性依赖
scope表示依赖范围;
由于maven管理了在不同执行场景下的classpath。主要分为编译classpath、测试classpath(编译和执行测试)和运行classpath。scope元素的类型就决定了该依赖jar包的classpath。具体决定关系如下表所示:
|
编译classpath |
测试classpath |
运行classpath |
举例 | |
|
compile(默认) |
√ |
√ |
√ |
|
|
test |
√ |
JUnit |
||
|
provided |
√ |
√ |
servlet-api,在编译和测试时需要,但运行时容器已提供,不需重复引入 |
|
|
runtime |
√ |
√ |
JDBC驱动 |
|
|
system |
√ |
√ |
maven仓库之外的本地类库文件 使用时必须通过systemPath显式置顶依赖文件路径,应慎用 |
多模块-父模块依赖配置
在有父子pom配置的结构下,子模块可以继承父模块的依赖,父pom需通过dependencyManagement元素管理,如下图所示。父pom配置依赖后,子模块需要使用该依赖时,只需配置groupId和artifactId,maven即会去父pom中寻找相关依赖。

依赖解析原则
由于不同的模块可以配置不同的依赖,而依赖的库又有自己的依赖,在多层依赖下有可能会产生依赖冲突。因此在maven配置下定义了两条依赖解析原则:
路径近者优先;
第一声明者优先
例如某项目有各依赖对x构件的依赖关系如下:a-b-c-x1 a-c-x2 a-d-x3 则解析x2。
实用maven笔记二-信息&依赖管理的更多相关文章
- Maven多模块项目依赖管理
Maven多模块项目依赖管理及dependencies与dependencyManagement的区别 转自:http://blog.csdn.net/liutengteng130/article/d ...
- maven——项目构建和依赖管理工具
apache maven是一个用于项目构建和依赖管理的工具. 添加archetype https://repo1.maven.org/maven2/archetype-catalog.xml 更改本地 ...
- Spring mvc 4系列教程(二)——依赖管理(Dependency Management)和命名规范(Naming Conventions)
依赖管理(Dependency Management)和命名规范(Naming Conventions) 依赖管理和依赖注入(dependency injection)是有区别的.为了将Spring的 ...
- 实用maven笔记一概念&构建
maven,作为我现在每天都会使用的工具,却发现我还有很多地方了解的迷迷糊糊.老大就曾说过我的一个问题在于,做事情不够精细.大概就是太浮于表面吧.最近突然非常想把maven撸一遍.豆瓣搜了下高分书籍, ...
- iptables实用教程(二):管理链和策略
概念和原理请参考上一篇文章"iptables实用教程(一)". 本文讲解如果管理iptables中的链和策略. 下面的代码格式中,下划线表示是一个占位符,需要根据实际情况输入参数, ...
- 实用maven笔记四-打包&其他
通过使用maven的生命周期和丰富多样的插件,可以方便的将项目代码编译打包为自己需要的构件. maven默认项目主代码位置src/main/java目录,测试代码位置src/test/java目录.主 ...
- 实用maven笔记三-仓库
maven管理依赖的一个很重要的基础在于,其维护了收集大量依赖jar包的仓库. maven的仓库分类为本地仓库和远程仓库. 构件在仓库的路径大致为:groupId/artifactId/version ...
- linux学习笔记二-----文件权限管理
一.分析文件权限(ln -s 文件名 快捷方式名 用来创建文件的快捷方式,下方ll查看信息时会在第一个字符处显示l) [hjp@bogon ~]$ ll total 4 drwxrwxr-x. 2 h ...
- 【maven】插件和依赖管理
1.插件管理 定义 pluginManagement 用来做插件管理的.它是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManage ...
随机推荐
- VB - 操作符(含Is)
在VBScript运算符中,加减乘除都是我们常用的符号,乘方使用的是 ^ ,取模使用的Mod. 在比较操作符中,等于.小于.大于.小于等于.大于等于都与我们常用的符号是一致的,而不等于是小于和大于连用 ...
- mysql 查看数据库最大连接数
show variables like '%max_connections%'; navicat 切换到命令行: navicat查看建表语句: 选中表,右键,对象信息,选择DDL
- win8.1安装Python提示缺失api-ms-win-crt-runtime-l1-1-0.dll问题
Windows下安装python成功之后,运行python,提示缺少api-ms-win-crt-runtime-l1-1-0.dll.很显然,安装上这个dll文件不就可以了吗.于是就开始百度,找资料 ...
- python基础--快速排序
1.快速排序 快速排序是一种交换排序. 快速排序由C. A. R. Hoare在1962年提出. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大 ...
- 讲真,下次打死我也不敢随便改serialVersionUID了
讲真,下次打死我也不敢随便改serialVersionUID了 码农沉思录 码农沉思录 微信号 code-thinker 功能介绍 笔者为国内某知名企业不知名码农,专注Java Web领域多年,有丰富 ...
- webpack4入门到进阶案例实战课程
愿景:"让编程不在难学,让技术与生活更加有趣" 更多教程请访问xdclass.net 第一章 webpack4前言 第一集 webpack4入门到进阶案例实战课程介绍 简介:讲述w ...
- 从前端角度出发有哪些注意事项有利于SEO?
1.提高页面加载速度. 能用css解决的不用背景图片,背景图片也尽量压缩大小,可以几个icons放在一个图片上,使用background-position找到需要的图片位置.可以减少HTTP请求数,提 ...
- Ubuntu18.04安装Tensorflow1.14GPU
软件要求 必须在系统中安装以下 NVIDIA® 软件: https://www.pytorials.com/how-to-install-tensorflow-gpu-with-cuda-10-0-f ...
- @PathVariable、@RequestParam、@RequestBody注解
讲解更加详细的参考资料 https://blog.csdn.net/u011410529/article/details/66974974 https://www.cnblogs.com/soul-w ...
- 人脸识别课件需要安装的python模块
Python3.6安装face_recognition人脸识别库 https://www.jianshu.com/p/8296f2aac1aa