目前我经历的公司的主要项目管理工具都是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. OSX 创建 randisk(或称 tmpfs)

    创建步骤: #!/bin/bash ramdisk_size_in_mb= mount_point=/private/tmp ramdisk_size_in_sectors=$((${ramdisk_ ...

  2. python 类和对象下

    类的常用函数 issubclass() 检测一个类是否是另外一个类的子类 格式1:issubclass(被检测类,父类) 返回值:布尔值 格式1:issubclass(被检测类,(父类1,父类2,父类 ...

  3. div里添加元素样式

    function YUEFEN() { $(".BBNL_2").click(function () { $(".BBNL_2").css("colo ...

  4. box-shadow 制作单边阴影效果,不影响其它边的效果

    box-shadow 制作单边阴影效果,不影响其它边的效果:  https://blog.csdn.net/u010289111/article/details/53171128 CSS 样式实现单边 ...

  5. iphoneX的适配问题

    iphoneX();function iphoneX(){ var oMeta = document.createElement('meta'); oMeta.setAttribute('name', ...

  6. 自定义checkbox(对勾)和radio样式

    checkbox: html: <div> <label class="unSelected selected" for="choose"&g ...

  7. Dev常用控件

    GridControl TreeView DEV GridControl小结.. https://blog.csdn.net/happy09li/article/details/7186829 Dev ...

  8. ReactNative 遇到的问题汇总

    1.react-native 启动项目出现如下报错 解决方法: nvm install v9.0.0 nvm alias default v9.0.0

  9. 在 IntelliJ IDEA 中这样使用 Git,效率提升2倍以上

    1.Git简介 Git是目前流行的分布式版本管理系统.它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响.也因此其近乎所有的操作都是本地执行,所以在断网的情况下任然可 ...

  10. vue 前后端分离 接口及result规范 及drf安装使用方法

    接口 # 接口:url链接,通过向链接发送不同的类型请求与参数得到相应的响应数据​# 1.在视图层书写处理请求的 视图函数# 2.在路由层为视图函数配置 url链接 => 产生接口# 3.前台通 ...