目前我经历的公司的主要项目管理工具都是maven,maven除了是一个实用的构建工具外,也是一个功能强大的项目管理工具。其管理功能分为信息管理和依赖管理。通过pom.xml文件实现。

信息管理

信息管理主要用于定义当前项目构建的主要信息。

  • 单模块项目

对于单个模块项目,其主要管理元素如下:其中project元素为pom.xml的根元素,groupId+artifactId+version三者合一被称为项目的坐标。

  • 多模块项目

maven除了可以定义单模块的项目外,还可以通过多个pom.xml文件的配置,将多个模块组织成平行结构或父子结构的多模块项目。由于目前接触比较多的是父子结构的多模块项目,此处主要介绍下该结构下的信息管理配置。

父子结构的项目,父模块下一般并无项目代码,只是一个父pom文件用于将多个子模块、多模块依赖、多模块打包组合在一起。一个典型的父pom管理信息配置如下,其中:

  1. packaging值必须为pom,否则项目无法构建;

  2. module的值为子模块相对于父pom的相对目录,用于定位子模块。

子模块的pom配置相对复杂,需配置parent元素,用于指定父pom。例如下图,其中:

  1. parent包含groupId/artifactId/version/relativePath

  2. relativePath表示父pom相对当前pom的项目路径;可不填写,不填时默认值为../pom.xml。该元素用于当子模块构建时,根据该值检查父pom的依赖。

依赖管理

依赖管理用于处理项目模块对库的依赖关系。特别是当一个项目是多模块项目时,通过依赖管理处理依赖冲突变得特别重要。

  • 单模块依赖

模块的依赖,也跟项目的信息一样通过groupId+artifactId+version坐标定义,此外还有些其他元素用于配置一些特殊信息,例如下图

其中:

  1. type类型默认为jar

  2. optional用于标记依赖是否可选

  3. exclusions用于排除传递性依赖

  4. 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配置下定义了两条依赖解析原则:

  1. 路径近者优先;

  2. 第一声明者优先

    例如某项目有各依赖对x构件的依赖关系如下:a-b-c-x1 a-c-x2 a-d-x3 则解析x2。

实用maven笔记二-信息&依赖管理的更多相关文章

  1. Maven多模块项目依赖管理

    Maven多模块项目依赖管理及dependencies与dependencyManagement的区别 转自:http://blog.csdn.net/liutengteng130/article/d ...

  2. maven——项目构建和依赖管理工具

    apache maven是一个用于项目构建和依赖管理的工具. 添加archetype https://repo1.maven.org/maven2/archetype-catalog.xml 更改本地 ...

  3. Spring mvc 4系列教程(二)——依赖管理(Dependency Management)和命名规范(Naming Conventions)

    依赖管理(Dependency Management)和命名规范(Naming Conventions) 依赖管理和依赖注入(dependency injection)是有区别的.为了将Spring的 ...

  4. 实用maven笔记一概念&构建

    maven,作为我现在每天都会使用的工具,却发现我还有很多地方了解的迷迷糊糊.老大就曾说过我的一个问题在于,做事情不够精细.大概就是太浮于表面吧.最近突然非常想把maven撸一遍.豆瓣搜了下高分书籍, ...

  5. iptables实用教程(二):管理链和策略

    概念和原理请参考上一篇文章"iptables实用教程(一)". 本文讲解如果管理iptables中的链和策略. 下面的代码格式中,下划线表示是一个占位符,需要根据实际情况输入参数, ...

  6. 实用maven笔记四-打包&其他

    通过使用maven的生命周期和丰富多样的插件,可以方便的将项目代码编译打包为自己需要的构件. maven默认项目主代码位置src/main/java目录,测试代码位置src/test/java目录.主 ...

  7. 实用maven笔记三-仓库

    maven管理依赖的一个很重要的基础在于,其维护了收集大量依赖jar包的仓库. maven的仓库分类为本地仓库和远程仓库. 构件在仓库的路径大致为:groupId/artifactId/version ...

  8. linux学习笔记二-----文件权限管理

    一.分析文件权限(ln -s 文件名 快捷方式名 用来创建文件的快捷方式,下方ll查看信息时会在第一个字符处显示l) [hjp@bogon ~]$ ll total 4 drwxrwxr-x. 2 h ...

  9. 【maven】插件和依赖管理

    1.插件管理 定义 pluginManagement 用来做插件管理的.它是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManage ...

随机推荐

  1. PAT甲级——A1155 HeapPaths【30】

    In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...

  2. laravel在路由中设置中间件

    //单个 路由 Route::get( 'admin/admin/index' , [ 'middleware' => 'old', 'uses' => 'Admin\AdminContr ...

  3. canvas时间粒子

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. nginx的原理

    Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程 (cache loader)和缓存管理器进程(cache manager) ...

  5. js转换成数字

    /** * 转换成数字,有两种方法: * 1.Number(var) * 2.parseInt(var)与parseFloat(var) */ // 字符串转换成数字 // 纯字母 var foo = ...

  6. C# 编程--数组

    数组 可以帮我我们一次声明存储多个相同类型的变量.用来解决同一类大量数据在内存存储和运算的功能特点:连续.同一类数据数组定义==>赋值==>取值    定义:        int[] n ...

  7. 【彩彩只能变身队(第七组)】Alpha版

    演示总结 -by 彩彩只能变身组(第七组) Part one:功能简介 教师端——班级主页 教师端——创建班级 教师端——批改作业 教师端——作业上交情况 学生端——班级主页 学生端——作业上传 在开 ...

  8. jquery 实现复选框选择效果

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  9. Requests使用

    Requests 简介 Requests库 requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到.可以说,**Requests 完全满足如今网络的需求 ...

  10. html+jquery+php实现文件上传全过程

    本例子采用html+jquery+php实现上传功能 html部分 <!DOCTYPE html> <html> <head> <meta charset=& ...