Maven
简介
正确读音:
Tomcat是Apache下的一个项目, 基于JDK, 是网络容器, 提供了网络支持的工具.
Maven也是Apache下的一个项目, 也是基于JDK, 是项目管理构建工具.
构建
构建不是创建, 构建一个项目 != 创建一个项目
一个项目从创建, 到完成源码编写, 最后将项目部署到网络服务器, 供所有人访问的过程叫项目构建。
所以: 构建过程:
创建项目 --> 源码编写 —> 编译 --> 运行—> 测试—> 打包—>部署
Maven对整个项目构建流程进行管理,能够大大提高工作效率, 为程序猿减负。
市场上还有很多构建工具:
1. gradle
2. Ant
但都没有maven流行, maven现在是Java领域里, 项目管理构建的老大哥.
为什么使用Maven
传统JavaWeb开发方式
TOMCAT 网络容器(Servlet容器), 提供网络支持, 程序猿不需要关心网络代码.
JavaWeb开发中, 经常用的 HttpServletRequest request , HttpServletResponse response就是Tomcat帮我们创建, 将请求数据封装到了request对象中. 我们自己将响应数据封装到response对象中,响应浏览器,在页面上显示数据。
业务代码: 完成客户需求所写的代码, Java程序猿以业务为核心
通常后端开发架构为: 三层架构模型MVC, 分层后 分工明确, 逻辑清晰, 项目易于维护
M: Mode 指的是 业务层和持久层 专注于核心业务代码, 处理数据
V: View 指的是 视图层/ 展示层 专注于展示数据
C: Controller 指的是 控制器层 专注于数据验证, 与数据的请求响应打交道 也就是API层
程序运行所需jar包
最终程序 = 我们自己写的部分(mvc) + 程序运行所需jar包(公司内部打成的jar包 或者 是第三方提供jar包)
公司内部jar包 : 中大型公司在中大型项目上一般会分成多个小组, 每个小组负责几个模块, 模块与模块是相关联的, 所以小组与小组之间通常以jar包的形式配合开发, 协助开发.
第三方jar包:
- 做支付用的: 支付宝相关jar包, 微信相关jar包
- 做上传用的: Apache Commons fileupload.jar包
- Spring框架: Spring相关jar包
- SpringMVC框架: Spring web相关jar包
- Mybaits框架: Mybaits相关jar包
- 数据库驱动包: Mysql相关jar包, Oracle相关jar包等
- 各种各样的工具包.
传统JavaWeb开发存在的问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pcicGwHb-1607047618679)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122092917897.png)]
- Jar包找起来麻烦 如: 一个程序猿得从其他项目copy, 缺少的包得从网络上找, 耗时严重, 如果, 找不到, 自己开始造轮子, 而且还不一定好用, 除了维护业务代码, 还得负责维护轮子。
- 缺少依赖 如: A包依赖B包, 结果只引入了 A包, 没有引入B包, 出现报错, 更可怕的是依赖链条很长
- 寻找正确的依赖包困难耗时 如: C包依赖V3.0.0, 结果引入的是V1.0.0
- 版本冲突 如B和C都同时依赖E, 但两者依赖的C的版本都不一样, 一个V1.0.0, 一个V3.0.0,A通过依赖传递, 获取到了E包, 如果A想用的V3.0.0, 但引入的是V1.0.0, 这个时候就有问题了。
- jar包排除困难 如 : 程序猿怎么知道 A 到底依赖 的是 E的 V1.0.0, 还是V3.0.0 , 需要花费程序猿大量精力
- 版本回退麻烦, 效率低下 如: Spring5.2.9 想回退到 Spring5.2.7版本
总结: 传统引入jar包的方式, 会存在很多问题, 而且还会令人抓狂, 不知所措, 浪费宝贵的时间, 加班加点, 加速秃头,损害身体健康, 影响家庭和睦, 加大企业成本投入, 影响社会稳定发展。
Maven解决的问题
-
不需要到网络上找jar包, 减少寻找时间
-
引入一个Jar包, 会将它所依赖的Jar包都下载到本地, 解决了缺少依赖 , 依赖包难以寻找的问题
-
易排除依赖,解决版本冲突问题, Maven提供了排除依赖的语法
-
版本回退容易, 只需要修改相应依赖的版本即可。
总结: 有了Maven技术,从此Jar包问题得到了有效解决, 程序猿可以专注于业务开发, 大大提高了工作效率, 而且身体渐渐好转, 加班减少, 秃头率降低, 有时间陪家人, 提高家庭幸福感,减少了企业成本投入, 促进社会稳定繁荣。
Maven基础
Apache Maven 基于JDK环境, 电脑上要有 JAVA_HOME 系统变量
IDEA默认安装Maven
编辑器使用的是 IntelliJ IEDA , JAVA开发人员大部分都使用, IDEA默认自带Maven
默认的maven文件在 IDEA中的位置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S7ZYkYF8-1607047618680)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122145007048.png)]
IDEA自带 Maven的版本 和自己的IDEA版本有关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-27eyYAtF-1607047618681)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122145605702.png)]
Maven的核心配置文件 settings.xml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5aEbkbBb-1607047618681)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122145138671.png)]
IDEA配置Maven, 默认以配置, 我们来看一下 File -> Settings -> Build -> Build Tools -> Maven
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QdrnW9sg-1607047618681)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122150258657.png)]
-
Maven home directory : Maven家目录位置, 本地Maven包位置
-
User settings file: 核心配置文件位置 , 此文件位置可修改
-
Local repository: 本地仓库位置 此文件位置也可以修改 默认会存放在 .m2/repository 目录下
注意: 此目录下的文件是因为本人之前已经使用过默认maven去管理项目, 所以存在相关jar包, 如果大家第一次使用, 下方是没有任何文件的.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fhnkH6yf-1607047618684)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122150806782.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CshNWzOD-1607047618685)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122150749558.png)]
创建普通Maven项目
File —> New Project ----> Maven 选中后直接点击下一步
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CSRF1bs2-1607047618686)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122151614218.png)]
项目配置 , 配置后点击 Finish
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFvcnpwY-1607047618686)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122152231813.png)]
Maven标准目录结构
传统的目录结构, 每个人可能都不一样, 每个公司也可能都不一样, 没有规范性, 熟悉了一套目录结构的人到另一个不一样的结构, 需要画时间熟悉熟悉.
为避免这种情况出现, Maven规范了项目目录结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yL0mnmsv-1607047618687)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122152417745.png)]
Maven对象模型 POM
POM: 全称 Project Object Model 项目对象模型. 用于进行项目配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j6pn8D4Z-1607047618688)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122152621226.png)]
Maven坐标 GAV
groupId: 公司域名反写
artifactId: 通常和项目名称保持一致
version: 项目版本 1.0.0.RELEASE 1.0.0.SNAPSHOT
总结: 这三位合起来 唯一 标识一个项目, 相当于我们每个人的身份证号
这三位简称: GAV坐标
扩展: 自己平时所看到的 ALPHA Beta 这些都属于测试版本 RC表示即将发行的稳定版本
RELEASE / GA / Stable 都属于稳定版本
Maven依赖管理 dependencies
依赖管理帮我们解决了传统JavaWeb项目引入诸多jar包带来的种种问题. (版本更换, 依赖导入, 版本冲突, 减少查找时间, 提高工作效率)
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.supersoul</groupId>
<artifactId>maven_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--依赖管理-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
</dependencies>
</project>
引入spring-webmvc, 会将此包所依赖的包都下载, 而且修改版本非常方便
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RFrU1ASG-1607047618688)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122204042893.png)]
Maven进阶
外部安装Maven环境
下载Maven安装包
下载地址: https://maven.apache.org/download.cgi
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mYiPIRaR-1607047618689)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201123165814811.png)]
Maven安装包目录介绍
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uZPOAnUC-1607047618689)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201123170020721.png)]
配置Maven环境变量
新建MAVEN_HOME 系统变量, 值为Maven的根目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mra0Be65-1607047618690)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201123173154850.png)]
点击编辑, 配置到 MAVEN_HOME根目录下方的 bin目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n7tLrv5G-1607047618691)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201123173219364.png)]
仓库分类
中央仓库:
包含了世界上几乎所有流行的开源项目模板, 依赖(jar包), 插件 有Maven团队自己维护, 服务于整个互联网.
此服务器在国外, 国内程序猿下载jar包时, 龟速.
仓库地址 http://repo1.maven.org/maven2
其他公共库:
例如: Java.net Maven 库和 JBoss Maven 库
都在国外, 速度较慢.
镜像仓库:
配置镜像仓库的目的一般是出于网速考虑。 由于国内访问境外远程仓库太慢, 所以我们需要配置镜像仓库
一般在 maven 的 核心配置文件 settings.xml 配置阿里云镜像, 速度快
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
私服:
搭建在局域网内的一个私有仓库服务器. 内部开发人员可以节省带宽和时间
可以代理所有外部的远程仓库
团队中的项目jar包也可以放到私服上.供其他项目使用
一般使用 Nexus 来构建私服( 也称为 企业级 Maven 仓库 )
本地仓库:
用来存储从远程仓库下载的插件和jar包, 主要起缓存作用
可以通过Maven核心配置文件 settings.xml 配置本地仓库地址.
1. Maven本地仓库默认地址: ${user.home}/.m2/repository
2. 修改本地仓库地址:
<localRepository>本地计算机仓库路径地址</localRepository>
仓库jar包加载顺序 , 就近原则找.
无私服:
先从本地仓库找, 找到后就不会去远程仓库去找.
如果本地仓库没有, 就从远程仓库找, 找到后,下载到本地仓库. 如果远程仓库也没有, 怎会报错.
有私服:
先从本地仓库找, 找到后就不会去远程仓库去找.
如果本地仓库没有, 就从私服找, 找到后,下载到本地仓库. 如果私服没有, 就去其他互联网上的远程仓库找, 找到后, 下载到私服, 下载到本地仓库.
如果远程仓库也没有, 就会报错.
常用命令
mvn: clean 清理编译文件
mvn: compile 编译文件
mvn: test 测试
mvn: package 打包项目
mvn: install 将本项目以jar包的形式安装到本地仓库
mvn: deploy 将项目jar包发布到远程仓库库
生命周期
清理编译文件
clean
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zgjehwGz-1607047618693)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122212543644.png)]
默认生命周期
编译–> 测试—> 打包—> 安装—> 部署
特点: 执行后一个, 之前的所有步骤会默认执行.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQJ5FCAY-1607047618695)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122212527420.png)]
站点生命周期
基本不用, 省略
Maven 插件
Maven生命周期所有的执行动作都依赖于插件, 没有插件, 生命周期毫无意义.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQGojE79-1607047618696)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201122212640655.png)]
使用Maven骨架创建普通Java项目
骨架: 就是模板的意思
注意: 复选框打勾 Create from archetype
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqoglvOS-1607047618696)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201124111501044.png)]
创建后的目录结构-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x70opjw7-1607047618697)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201124111628218.png)]
使用Maven骨架创建web项目
骨架: 就是模板的意思
注意: 复选框打勾 Create from archetype
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yWUtQlt5-1607047618698)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201124111801035.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JUKrnI3J-1607047618699)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201124111829813.png)]
Maven默认集成了Tomcat6
更换插件: tomcat7-maven-plugin
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
<finalName>mobile</finalName>
<server>tomcat7</server>
</configuration>
</plugin>
Maven概念模型
作用: 管理构建
一层: 依赖管理
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
</dependencies>
一层: 插件管理 构建(相关的插件) 环境功能 项目相关
<!--本项目 生效的插件-->
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
<finalName>mobile</finalName>
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
Maven依赖作用域
构建包括:
编译-----> 测试 ----> 运行 —> 打包
作用域Scope | 编译 | 测试 | 运行 | 打包 | 例子 |
---|---|---|---|---|---|
compile (默认作用域) | Y | Y | Y | Y | spring-core |
provided | Y | Y | lombok | ||
test | Y | junit | |||
runtime | Y | Y | Y | 数据库连接 |
Maven高级
分布式 :
每一个模块都能够独立运行, 相当于一个项目 , 部署在单独的一台机子上 , 多个项目之间通过网络连接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FMoptq0k-1607047618700)(C:\Users\13453\AppData\Roaming\Typora\typora-user-images\image-20201124162950552.png)]
Maven父子项目依赖继承
继承的目的: 复用依赖, 减少冗余配置
父项目pom :
-
pom的打包方式
- dependencyManagement 依赖容器 统一管理子项目依赖版本
- dependencies
子项目:
-
parent标签 relativePath 使用的是哪个项目的pom去实现继承
- 子项目继承了父项目的groupId
- 子项目会继承父项目的 dependencies下的依赖
- 子项目不会继承府项目的dependencyManagement 下的依赖. 如果想使用依赖容器中的依赖, 不需要写版本号
Maven多模块项目
很多也称为 Maven聚合项目
作用: 统一对子项目进行管理
父项目中: modules 去管理子项目
Jar包和War包的
jar:即Java Archive,Java的包,Java编译好之后生成class文件,但如果直接发布这些class文件的话会很不方便,所以就把许多的class文件打包成一个jar,jar中除了class文件还可以包括一些资源和配置文件,通常一个jar包就是一个java程序或者一个java库。
war:Web application Archive,与jar基本相同,但它通常表示这是一个Java的Web应用程序的包,tomcat这种Servlet容器会认出war包并自动部署。
RELEASE 和 SNAPSHOT的区别
SNAPSHOT: 快照版本
RELEASE: 稳定发布版本
RELEASE, GA R 没有任何修饰 稳定版本
SNAPSHOT Alpha Beta