目录
Maven简介
Maven是一个项目管理和构建的工具。它是基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建,报告和文档。
Maven的官方网站:Maven官网
对象模型:
Maven的作用
Maven是专门用于管理和构建Java项目的工具,主要功能有:
1.提供一套标准化的项目结构。
2.提供一套标准化的项目构建流程。
3.提供一套依赖管理机制。
详细说明如下:
一、标准化的项目结构
我们知道,Java的集成开发环境有很多,例如IntelliJ IDEA ,Eclipse等等,这些集成开发环境中创建的项目结构都是不一样的。因此移植性并不好,不太通用。因此Maven提供了一套标准化的项目结构,所有集成开发环境使用maven构建的项目,项目结构都是一样的。
使用maven构建的项目结构如下图:
二、标准化的构建流程
编译 => 测试 => 打包 => 发布。
Maven提供一套简单的命令来完成这一套流程。
如果项目模块很多,大大提高了效率。
三、依赖管理机制
个人认为,maven的依赖管理机制是maven的王炸,如果没有maven,我们需要使用jar包,就只能到苦苦网上到处查找,找到了没准版本还不对。如果使用maven,就只需要写坐标就可以导入想要的jar包等依赖,自动引入,无需亲自下载。
管理机制说明:
1. 依赖管理机制就是管理你项目所依赖的第三方资源,如jar包这样。
2. 只需要通过坐标配置就可以导入各种依赖(jar包等…)。
3. Maven使用标准的坐标配置来管理各种依赖。
Maven仓库简介
如上所有,maven只需要导入坐标就能导入jar包等依赖。这些jar包从何而来?
·就从Maven仓库中来。
Maven仓库是什么?
·简单来说就是存放各种jar的文件夹。
Maven仓库的分类
Maven仓库有多种,这些仓库都可以存一些我们需要的依赖。但是有区别。
分为:本地仓库、中央仓库,远程仓库
说明:
本地仓库:自己电脑上的一个目录。
中央仓库:由Maven团队维护的全球唯一的仓库。
远程仓库:一般由公司团队搭建的仓库,也称为私服。
我们在使用坐标导入jar包等依赖时,先查找本地仓库,如果本地仓库没有,会去中央仓库下载对应jar包等依赖,但是中央仓库有位于国外,下载速度很慢,所以一般会配置国内的镜像源。
Maven的安装和配置
在此使用Maven v3.6.1:
如需别的版本,可以返回上层目录下载即可。
2.解压,下载后解压后就算安装成功。
3.给bin目录配置环境变量。
4.配置本地仓库
到目录中,进入打开conf/setttings.xml,找到如图<localRepository>修改为自己创建的目录,用来存放以后导入的jar包等依赖。
5.配置远程仓库(私服)
因为中央仓库位于国外,下载速度堪忧,因此我们需要设置国内的镜像,也就是我们国内的这些远程仓库,映射了中央仓库的所有jar包等依赖,我们从国内私服下载就会快很多。
到目录中,进入打开conf/setttings.xml,找到<mirrors>标签内写入如下:
想要用其他镜像,可以自行百度。
值得注意:如果不配置本地仓库,本地仓库默认为:不配置仓库。
仓库位置:C:\用户\用户名\.m2\repository。
Maven常用命令
编译:mvn compile
清理:mvn clean 清理target目录
打包:mvn package
测试:mvn test 测试test目录
安装:mvn install 将target的项目传到本地仓库
命令可以打开打开Powershell窗口测试,
Powershell窗口可以到Maven项目目录中 shift + 鼠标右键,选择Powershell窗口打开即可。
Maven生命周期
Maven对项目构建的生命周期划分为3套。
1.clean:清理工作。
2.default:核心工作,例如:编译,测试,打包,安装等等。
3.site:产生报告,发布站点等。
值得注意的是:在同一生命周期内,执行后边的命令,前边的所有命令会自动执行。
例如:我们执行打包安装命令,编译,测试,打包都会执行。
Maven坐标
我们在Maven中,只要书写坐标,就可以导入jar包等依赖,那什么是坐标呢?
1.Maven中的坐标是资源的唯一标识。
2.使用坐标来定义项目或引入项目中需要的依赖。
Maven坐标的组成
- groupId:定义当前Maven项目隶属组名。
- artifactId:定义当前Maven项目名称。
- version:定义当前项目版本号。
使用坐标导入jar包
1.在构建的maven项目中,打开pom.xml文件,编写<dependencies>标签。
2.在<dependencies>标签中使用<dependency>引入坐标。
3.定义坐标元素:groupid,artifactid,version
4.刷新加载。
例如:导入spring-webmvc坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
坐标的依赖范围
通过设置坐标的依赖范围(scope),设置对应jar包的有效范围,如测试环境有效,运行环境无效等等 ,默认值为:compile(编译)。
依赖范围:
例如:junit坐标,作用范围为仅测试。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
Maven分模块开发
概述
我们没用到分模块开发时,会将某类东西都封装为包,例如表现层包,业务层包等等,放到一个模块中供自己调用,但在开发中,项目团队每个人负责的模块不同,每个人负责的模块中有时会存在一种情况:例如都需要使用pojo包,如果将pojo包放到自己的模块中的包中,其他的模块就访问不到了,所以,我们就可以将pojo抽离出来,供所有模块调用。这样的将原始模块按照功能拆分成若干子模块,方便模块间相互调用,接口共享,就是分模块开发。
分模块开发流程
1.创建maven模块,用于封装某功能
2.书写模块代码,将功能封装到该模块中。
3. 将书写好的模块安装到本地仓库,以供别的模块引用坐标可以成功运行。
团队开发需要将写好的模块放到公司私服中,供团队成员使用。
4.要应用功能模块的导入对应坐标即可。
Maven依赖管理
依赖指的是当前项目需要的jar包,一个项目可以设置多个依赖。
具体格式:
依赖传递
对于依赖来说是具有传递性的。也就是说,例如:导入了依赖a,a中存在依赖b坐标,当我们也需要b依赖时,只要导入了依赖a,就可以使用依赖b,不需要再次导入。这就是依赖的传递性。
直接依赖:在项目中通过依赖坐标配置的依赖。
间接依赖:导入的依赖a,此依赖a中存在依赖b,依赖b就是间接依赖。
依赖冲突时的优先级
存在两个版本的依赖,以pox.xml中声明较为后面的为准。
路径优先:深度越浅,优先级越高:
如图:当上2度和下3度存在相同资源时,2度的深度较浅,优先级更高。
可选依赖
在导入依赖时设置optional,可以阻止依赖传递。也就是说:在我们的模块中,引用坐标时,书写了<optional>标签为true,此坐标即为可选依赖,我们将模块提交到远程仓库,别人引用我们的模块时,就看不到我们设置为可选依赖的坐标。
排除依赖
导入某坐标时,不想要此坐标中的某依赖。可以选择排除。
例如:<exclusion>书写导入的模块中排除其中的log4j和mybatis依赖。
POM聚合
聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合。
聚合工程:通常是一个不具有业务功能的”空”工程(有且只有一个pom.xml文件)。
作用:实现对所包含的模块进行同步构建。
当工程中某模块发生更新时,必须保障工程中与更新模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题。
如图:左边的即为聚合工程
聚合工程的pom.xml文件书写步骤:
总结: 聚合工程开发:用一个工程管理多个工程,一个工程发生改动,依赖于这个工程的模块会随着改动。
POM继承
概念:继承描述的是两个工程之间的关系,子工程可以继承父工程的配置信息,常见为依赖关系的继承。
使用:
例如:声明一个父工程,把常用的一套坐标写在父工程的pom.xml中,以后只要子工程也需要这一套坐标,不必重复导入坐标,继承父工程即可。
作用 :
1.简化配置
2.减少版本冲突
继承书写步骤:
配置子工程中配置可选的依赖:
也就是子工程不会直接继承到,需要的话,手写(不需要写版本),自动继承父类版本。
聚合和继承的区别:
- 作用
- 聚合用于快速构建项目
- 继承用于快速配置
- 相同点
- 聚合与继承的pom.xml文件打包方式都是pom,所有两者可以写到同一个pom文件中。
- 聚合与继承均属于设计性模块,并无实际的模块内容。
- 不同点
- 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些(知道子类)。
- 继承是在子模块中配置关系,父模块无法感知哪些模块继承了自己(不知子类)。
属性
我们可以像在java中定义属性一样,声明了属性以后,就可以在其他地方使用,在POM.xml文件中,我们也可以定义属性,定义了属性后,我们就可以在pom文件或maven的资源文件中使用。
使用场景:
当我们许多依赖的版本需要统一管理时,也就是多个依赖需要版本相同,例如spring-webmvc,spring-test,spring-jdbc等等,他们的版本要求一致,我们就可以声明一个属性,给这个属性赋值,然后给他们引用即可,当版本需要修改时,我们只需要修改属性值即可。避免了某个漏改或改错的情况,导致版本冲突。
POM文件引用属性
属性定义的步骤:
1.在POM.xml文件中定义属性,自定义标签为属性名。属性值为自定义标签包裹,
2.引用属性,使用符号 ${ 属性名 }
资源文件中引用属性
我们在pom文件中设置的属性,不仅在pom文件内部可以使用,还能在外部的资源文件中使用。
例如:在配置文件中引用属性步骤
${project.basedir}为内置属性。
属性列表
我们在pom.xml文件中声明的为自定义列表,但是maven中的属性不仅仅只有这个,还有如下等属性可以引用。
Maven依赖-版本管理
我们在导入坐标时,可以看到有许多样式的版本。例如:
纯数字、SNAPSHOT(快照版)、RELEASE(发布版)等等
工程版本:
- SNAPSHOT(快照版本)
- 项目开发过程中临时输出的版,例如我们创建的工程。
- 快照版本会随着开发的进展不断更新。
- RELEASE(发布版本)
- 项目组对外发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会随着开发的进展不断更新。
发布版本:
- 纯数字版
- beta版(经过beta测试)
Maven多环境配置与应用
maven提供配置多种环境的设定,帮助开发者在使用过程中快速切换环境。
例如:在测试阶段使用测试阶段的务器,在开发阶段使用开发的环境。
多环境配置步骤:
1.定义多环境的配置
2.使用配置好的多环境
方式1:可以将想要使用的环境定义为默认环境,直接运行,就是使用定义为默认的环境。
方式2:使用命令:
mvn 操作指令 -P 环境定义时的ID,例如执行如上定义的环境:
mvn install -P pro_env
Maven中的跳过测试
在执行指令时,不进行测试。
应用场景:
1.快速打包,不需要测试,打包更快。
2.功能更新中并且没有开发完毕,测试会报错,例如,就想先打个包。
跳过测试执行方式:
方式一:IDEA中的快捷键
方式二:命令方式
mvn 指令 -D skipTests
方式三:细粒度控制(配置插件)
Maven中私服的使用
私服是一台独立的服务器,用于解决团队中内部资源的资源共享与资源同步的问题。
私服:Nexus下载
下载地址:官网下载,选择自己对应系统下载。
Nexus安装和启动
1.下载好压缩包,解压后即使安装成功。
2.启动服务器:
到安装的目录中,找到bin目录,进入到bin目录的命令行界面。输入命令:
nexus.exe /run nexus
3.访问私服(nexus默认端口号为8081)
http://localhost:8081
4.访问成功后,看到右上角,点击登录,按要求操作即可。
5.可以自定义创建仓库
私服中的一些概念
在私服中,其实就是存放着许多的仓库,供我们存储和提取资源。许多仓库的组成,就是仓库组,我们在进行资源的上传时,需要指定某个仓库,因为每个团队所使用的仓库不一样。但是我们向其中提取资源时,只需要访问仓库组即可获取,不需要精确到某个仓库。
过程:
当我们访问仓库组中的资源时,如果仓库组中不存在我们想要的资源,此时私服就会到设置好的中央仓库中下载,并返回给我们。然后将此资源进行存储。
私服仓库分类
本地仓库访问私服仓库
本地仓库中需要的配置
到我们下载的maven的目录 /conf/settings.xml 打开文件进行配置。
配置1:配置访问私服需要的权限(账号密码)
<servers>
<server>
<id>仓库名称</id>
<username>用户名</username>
<password>密码</password>
<server>
</servers>
配置2:配置私服访问路径
<mirrors>
<mirror>
<id>仓库组名</id>
<mirrorOf>*</mirrorOf>
<url>仓库组URL地址</url>
</mirror>
</mirrors>
仓库组URL可以点击仓库组,显示的信息面板有显示。
使用私服上传和下载资源
在pom文件中设置上传和下载所使用的仓库。
<distributionManagement>
<repository>
<id>仓库名称</id>
<url>仓库的URL地址</url>
</repository>
</distributionManagement>
上传资源 (部署资源到私服)
方式一:IDEA中快捷键deploy
方式二:使用命令
mvn deploy
更改私服所应用的中央仓库
设置私服所使用的中央仓库,当访问的资源私服中不存在时,向设置好的中央仓库中获取后返回给我们。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154557.html