可以这么说,前面4篇Maven入门的文章其实是没有入门,只不过可以让我们学会简单地创建Maven项目。但其实,之前我们这么做不是不可以,确实有很多不规范和缺陷的地方。本篇从介绍Maven的几个核心概念开始,继续来完善这个Maven入门系列文章,达到更好掌握Maven这个自动化构建工具的目的。
这里说到了自动化构建工具,作为测试或者测试开发应该要有兴趣。可以说,如果你是Java开发或者测试开,你对Maven掌握好的好,做持续集成和持续部署是很有利的,也就是我现在在做的CI CD pipeline开发是很有帮助。
1.构建工具的发展历史
简单看看自动化构建工具的发展历史。maker->ant->maven->gradle
一开始是出现maker这个工具,程序员要自己写各种自动化脚本,这样去驱动完成一些自动化构建。后来出现了ant,也就是小蚂蚁,比maker简单多了,程序员可以从自己写自动化构建脚本中解脱出来一部分精力。接着出现了maven这个工具,maven是由java语言开发出来的工具,只适合Java的项目,例如python开发就和maven没有一毛钱关系。Maven到现在差不多有快二十年发展,依然是Java项目开发中管理依赖包的一个流行的选择。gradle也是构建工具,这个是和android一起发展起来的,android程序员应该对gradle熟悉。理论上gradle比maven要更好用,更强大,也有一些大型项目使用gradle来自动化构建。我自己项目中,有十几个工程同时开发,几百个程序员开发这个产品,里面就选择了gradle作为构建工具。
什么是构建,在Jenkins平台这个英文单词是build,简单来说构建是一个过程:从检查开始,编译,运行测试,得到测试结果,也叫报告,然后打包,例如jar包或者war包,然后部署,部署到tomcat容器,这个一系列的过程叫构建。
2.Maven配置环境变量
网上我们搜索maven环境配置的时候,有时候看到有人写MAVEN_HOME,也有人使用M2_HOME, 这两个都是可以的,我习惯使用M2_HOME这个环境变量名称。
3.Maven仓库的概念
来简单了解Maven仓库的概念。Maven仓库分成以下几个分类,大的来说分成本地仓库和中央仓库。中央仓库又分成私服和中央仓库和中央仓库镜像。
本地仓库:就是你本机器安装maven后,下载依赖包、插件保存的位置。例如默认位置是C:\Users\Anthony\.m2\repository
Anthony是我电脑登录账号,换成你的同样可以找到这个路径。这个仓库的作用就是为当前电脑上所有Maven工程服务。
私服:私服就是每个公司下不同部门自己搭建的Maven中央服务器。例如,一个开发中心,一百多个人,其中只有一部分人能上网,而且上网的机器是领导管理的。当然这只是一个例子,还有就是避免重复,冲突。一个部门使用自己搭建的Maven私服也是原因之一。这个私服在局域网之内,可以服务这个局域网内所有开发的Maven项目。
在Maven私服中,不得不提Nexus这个产品,和Google手机品牌一样的名称。到时候你们部门开发搭建了这个Nexus私服,你不要不知道是干嘛的。
中央仓库:这个中央仓库,默认就是全球都使用的这个Maven服务器,应该是在美国。我们如果不修改仓库地址,就默认使用这个中央仓库下载各种依赖包,所以速度很慢,有些依赖包甚至需要连接VPN服务才可以顺利下载到本地。
中央仓库镜像:就是由于Maven中央仓库访问太慢,负载太重。所以需要在全球不同洲创建不同镜像站点来分担中央仓库的服务器压力。用户使用Maven下载更新项目依赖包,会自动从最近镜像站点下载。这个阿里巴巴应该也有类似中央仓库镜像的服务,关于maven这块。
4.如何更改默认的仓库
上面说不同的仓库,有时候我们不能使用本地仓库,需要使用公司私服或者其他人提供的局域网仓库地址,或者使用阿里巴巴的maven中央仓库。这里来看看怎么修改这个默认仓库。
4.1 在你maven安装路径找到配置文件 C:\apache-maven-3.6.2\conf\settings.xml
4.2 找到下面这几行
4.3 取出
上面这个地址,我是随便写了一个网络中机器的Maven仓库地址,这个看每个公司私服地址就好了。使用私服或者别人的maven仓库地址好处就是,不再需要从网络下载各种常见的依赖包和插件去执行我们的自动构建任务。常用的依赖和插件在私服中已经下载过了,这样节约时间。
4.4 保存文件,就这样改成不使用本机的本地仓库。
5.坐标
上面介绍了仓库的概念,这下说说坐标。生活中使用坐标,例如在二维平面,我们可以根据X,Y的坐标去定位唯一一个点。在三维空间,我们可以使用X,Y,Z这个坐标去定位唯一的一个位置。同样在maven项目管理中,例如美国那个Maven中央服务器,需要管理几百万个jar包和插件或者项目。这里就引入了坐标,通过坐标这个规范和约束,可以定位到全球哪家公司提供的那个项目的那个版本的jar包。
什么是Maven中的坐标呢?
下面看看在Eclipse上创建一个Maven工程的页面截图。
上个三个条件,每个单词开头字母,有时候GAV就表示Maven中的坐标。
Group Id: 这个表示组织成员或者公司,例如 com.alibaba。或者com.alibaba.一个项目名称。
Artifact Id: Artifact是工件的意思,这里表示项目名称,例如dubbo
Version:表示版本,例如2.6.7
根据上面的解释,我们在pom.xml或者maven官方网站可以看到阿里的dubbo的坐标是这么写的。
根据这个坐标,如果maven下载过这个依赖,那么你可以在本地仓库里找到com/alibaba/dubbo/dubbo-2.6.7这个文件夹结构。
有时候我们在version这里可以看到是RELEASE或者SNAPSHOT,这个有不同含义。一般我们开发阶段来说,这个version有SHAPSHOT这个标签,表示快照,就是容易变化不稳定。而这个产品需要发布上市,我们可以用RELEASE标签。例如我们在maven中使用Spring的依赖,在version就看到RELEASE标签,就是这么个含义。
6.Maven的命令
目前我们只学了一mvn -v这个命令,用来查看mvn安装版本。
其实我们使用Maven,核心是使用maven中的几个构建相关的命令
这个简单来解释下install这个安装命令,为什么阿里的dubbo这个jar包能放到maven的全球仓库中,而且是安装坐标的约束和规范,全球的人都可以使用。这个install有点类似我们docker中push镜像到仓库的过程。
对照一个举例Eclipse中Maven项目,我们来简单解释下上面几个命令的用法和作用。
第一个是mvn clean, 我们要知道maven中自动构建的产出物都放target文件夹下,里面包括class字节码文件和jar或者war包,以及其他文件。这个清理就是我们在一个经常构建的项目中,我们先执行清理,也就是把target文件夹以及里面内容都删除。然后执行第二个阶段,也就是编译,这样确保每次编译的字节码文件都是最新代码产生的。
第二个mvn compile, 这个是编译主程序,在maven项目中src/main/java下的源码文件就是主程序,这个命令就编译这里的java代码用的。
第三个mvn test-compile: 上面是编译主程序,这里就是编译测试程序,也就是src/test/java下的代码文件。
第四个mvn test: 执行测试,会自动执行Junit或者TestNG管理的测试代码,需要在pom.xml文件中配置。
第五个mvn package, 也就是打包,如果是普通java的maven项目,就是jar包,如果是web项目,就是war包。
第六个mvn install: 安装执行,把你当前maven项目发布到对应maven仓库。
上面6个命令执行的效果,在target文件夹下对应着不同的产出物。
classes表示存储编译主程序的class字节码文件,test-classes,就是编译src/test/java下的代码的字节码文件。maven-archiver是执行mvn install产生的,surefire-reports是一个测试报告的产出,最后这个jar是执行mvn package产生的。
上面具体mvn 命令我们稍后文章来详细介绍。