maven的一些梳理,简要版

日常中的一些maven概念和基本用法


我们在项目的版本管理,项目构建最常用的是maven和gradle,笔者使用大部分场景都是maven,gradle只是自己尝试过用法.没有深入认识,本文就介绍maven了.

1. 标准化构建

maven为我们提供了简单快捷的项目构建,同时也提供了大量工具和插件能够进行适配.我们在构建一个项目时,常常会用到很多标签,这些标签就是maven构建的显式配置.以下我们会简要说明一些常用的标签.

1.1 project 标签

<project>: 是所有pom.xml的根元素,声明了一些POM相关的命名空间及xsd元素

1.2 modelVersion 标签
  • <modelVersion>: 指定了当前POM模型的版本,对于Maven2 及Maven3来说,只能是4.0.0
1.3 groupId 标签
  • <groupId>: 项目的组或者路径,一般为com.fan.gao,这在我们项目中常见的是src/main/java下的最上层包路径
1.4 artifactId 标签
  • <artifactId>: 项目的名字,唯一编号,也就是项目名喽
1.5 version 标签
  • <version>: 项目的版本,SNAPSHOT一般为快照,非稳定版本使用,完整的项目版本号分为四个部分组成:
    <主版本号>.<副版本号>.<增量版本>-<里程碑版本>,我们常用的是主副版本号.主版本号: 项目的重大变更时递增,此版本号:较大范围的功能增加或者变化以及bug修复.增量版本: 一般表示重大的bug修复,里程碑版本:往往指某一个版本的里程碑,一般表示不是非常稳定,还需要很多测试.这里讲一个发布版和快照版本.relerelease- 发布版本,一般是比较稳定,经过全覆盖测试后的版本.SNAPSHOT-快照版本,指不是很稳定,且可能当前版本不是固定版本,会随时发布.
1.6 packaging 标签
  • <packaging>: 可选war,jar 选择编译后压缩格式
1.7 name标签
  • <name>: 项目的名称
1.8 parent标签
  • <parent>: 父类模块的定义,如下
    -<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath /> </parent>
1.9 properties 标签
  • <properties>: 常用于引入的组件的版本号统一管理,也是自定义标签数据的方式
1.10 dependencyManagement 标签
  • <dependencyManagement>: 管理引入组件,在< dependencies>上层,可以用来让子模块进行可选择继承父模块组件.父模块使用此标签后,只有子模块在< dependencies> 中定义了引入组件的groupId和artifactId后才能使用,否则,子模块不具有该组件的依赖关系.
1.11 dependencies 标签
  • <dependencies> : 用于建议依赖关系,也就是我们常用的引入一些三方jar
1.12 dependency 标签
  • <dependency>: 三方jar或者说是组件的顶级标签
1.13 scope 标签
  • <scope> : 依赖范围,compile 编译依赖范围,没有指定,默认该范围,对于测试,编译,运行都有效;test 测试依赖范围,典型junit使用时;provided 已提供依赖范围,对于编译和测试classpath有效,运行无效;runtime 运行时依赖范围,对于测试和运行classpath有效,编译无效;system 系统依赖范围,与provided相同,不可移植,谨慎使用;import 导入依赖范围,不会对三种classpath造成影响.只在dependencyManagement下才会生效,< dependencyManagement></ dependencyManagement>该标签一般用于继承结构,父模块中使用,能够动态的进行引入,子模块需要简单的引入配置,groupId,artifactId就可以继承父类的配置使用.
1.14 exclusions 标签
  • <exclusions> : 排除依赖的上层标签,可以含多个子标签
1.15 exclusion 标签
  • <exclusion>: : 排除依赖传递的一种方式,常用于A项目中有D项目依赖,而B项目依赖了A项目,又持有D的依赖时,如果版本不一致会出现编译错误.因为maven依赖具有传递性.此时可以在B项目引入A项目的时候使用此标签.
1.16 build 标签
  • <build> : 项目构建的插件定义,或者针对项目的一些配置
2. maven仓库
2.1 本地仓库

本地仓库 本地仓库即我们settings.xml 中配置的地址,我们在进行install时,会优先查找本地库中的jar包.其次访问远程仓库.需要注意的是我们的settings.xml 常常会缓存到c盘下,有时候修改目标settings.xml不会生效也是因为这个原因造成的.

2.2 远程仓库
2.2.1 maven的中心仓库

maven 默认的中心仓库, http://repo1.maven.org/maven2/,我们在不修改默认配置时,我们所有的组件的后去都是通过中心仓库获取的(本地不存在时).

2.2.2 私服

私服目前比较流行的是Nexus,私服有几个优点:
节省带宽,因为较多的机器可能会无数次的获取资源,这样如果全部走网络传输可能会比较慢,使用私服可以通过环回地址获取,这样带宽就不会受到限制,更快速;
部署第三方构件,我们可能常常使用到一些在中心库中不存在的构件,这个时候我们可以通过mvnrepository.com去查找,但是这样也可能浪费带宽.针对这些资源我们可以放到私服中,提供用户获取.这样做也可以规范化使用,版本统一
提高稳定性, 我们可能会用到Jenkins类似CI工具,如果我们构建项目时网络不佳时可能会导致失败.而通过私服就能很好的解决这个问题
降低中心仓库的压力,这个是属于人道主义了,把稀缺的资源给更需要的人,哈哈

2.2.3 三方仓库

如jboss的三方仓库还有oracle类似,不做说明

3. maven聚合和继承
3.1 聚合

多模块的形式,一个项目下有多个功能模块,能够通过操作主pom来操作它的模块部分.我们常见的是,一个父模块,内容为空,但是有多个子模块.这其实就是使用主模块作为入口,可以统一对子模块进行操作,如打包,测试等操作.

3.2 继承

通过父类减少重复,子模块默认使用父模块配置内容.子模块可以继承父类的配置内容,大部分非全部可继承,我们上文描述的< dependencyManagement>就是一种可选方式,如果父模块使用此标签,则需要子模块引入组件才能够建立依赖关系.

4. 版本冲突

由于maven有依赖传递特性,可能会导致引入的包中有重复.这样一来maven在进行获取的时候会根据最短路径先进行筛选,选取最短路径作为目标.如果路径相同则会根据先后引入的顺序来选取目标.
maven选取选取引入包的规则: 1. 优先使用最短路径,2, 当路径一致时根据先后引入顺序.如a->b->c; 与a->c,第一个引用路径为2,第二个为1,则优先引入第二个路径.

4.1 排查依赖冲突
  1. 使用插件maven help 查看树形结构,是否有重复的引入存在.这个插件可在idea plugins中查找安装
  2. 使用maven指令,mvn dependency:tree
4.2 解决版本冲突
  1. 手动移除pom中无用的依赖关系,避免冲突出现
  2. Exclude 标签 掉不需要的包.这里使用Exclude标签是关闭依赖传递,并不是移除–常用
5. 常用指令及简要说明
5.1 mvn clean compile 编译当前项目

这是常用的编译命令,我们会常用于查看项目的相关环境是否正常.如果出现错误可通过 -X来查看详细的错误内容.

5.2 mvn clean test 运行项目中单元测试

这是运行所有的测试案例,也可以在打包时通过 mvn install -DskipTests 来跳过测试.执行测试后,会给我们返回执行情况,包含执行数量,错误数量.

5.3 mvn clean package 打包当前项目

将当前pom.xml 路径所在的项目进行打包,仅仅只是打包

5.4 mvn clean install 打包当前项目

打包当前项目并将打包后的jar安装到本地仓库中.这就意味着,我们可以在本地用其他项目进行依赖此项目的包了.

5.5 mvn clean deploy 打包上传私服

此命令是将当前项目打包,并上传至私服.

6. 整理的简要导图

在这里插入图片描述

7. 未涉及内容

本文主要根据maven实战进行整理.其中关于安装,持续集成,生命周期,私服搭建,生成项目站点以及插件部分未做描述,内容浅显了些.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值