Spring Boot 学习前你应该知道的 Maven 知识
Maven 是什么?
回答这个问题,我们先来了解下没有Maven,我们是怎么使用开发者工具IDE去开发Java程序的。我之前开发Java程序不多,但是我还是记得,我是从网上下载或从合作方拷贝 jar 包,从 Library 中添加到项目依赖,就这样构件一堆外部依赖来执行本地程序。
从事 ASP.NET 开发(C#)的朋友,更能清晰地表达出这个意思,DLL 文件漫天飞,只要拷贝过来就能用啦。
这将带来什么问题呢,比如同学A 和同学B 是一个项目的两个功能一个是CMS系统,一个是做问答系统,两个都是独立开发,使用了相同的 Json 库,但是版本不同,当他们合并项目的时候,问题来了,他们的第三方库管理混乱就出现了不少麻烦。相互兼容成了最大的问题。
当嵌套依赖出现的,内心几乎是奔溃的,见下图:
当项目 A引用了 组件B ,项目C 引用了组件 D,组件B,D都引用了 组件 E,但是B 引用了版本E1,D引用了版本E2,B 和D都是第三方组件,是不是很麻烦。这些大部分是因为第三方组件管理混乱。
有没有什么好的方法,使得开发者不在关系第三方组件管理,而是专心于业务的开发,Maven就是这样的管理工具,
Apache Maven是一个软件项目管理和理解工具。基于项目对象模型思想,Maven可以管理一个项目的构建、报告和信息中心文档
Maven为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为Maven使用了一个标准的目录结构和一个默认的构建生命周期。
Maven 具体完成什么工作呢
- 构建
- 文档生成
- 报告
- 依赖
- SCMs
- 发布
- 分发
- 邮件列表
总的来说,Maven简化了工程的构建过程,并对其标准化。它无缝衔接了编译、发布、文档生成、团队合作和其他任务。Maven提高了重用性,负责了大部分构建相关任务。
什么是Maven仓库
Maven仓库用来存放Maven管理的所有Jar包。分为:本地仓库 和 中央仓库。
-
本地仓库:Maven本地的Jar包仓库。
-
中央仓库: Maven官方提供的远程仓库。
当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。
Maven特点 约定优于配置
Maven 使用约定而不是配置,意味着开发者不需要再自己创建构建过程。
开发者不需要再关心每一个配置细节。Maven为工程提供了合理的默认行为。当创建Maven工程时,Maven会创建默认的工程结构。开发者只需要合理的放置文件,而在 pom.xml 中不再需要定义任何配置。
下表展示了工程源码文件、资源文件的默认配置,和其他一些配置。假定${basedir}表示工程目录:
配置项 | 默认值 |
---|---|
source code | ${basedir}/src/main/java |
resources | ${basedir}/src/main/resources |
Tests | ${basedir}/src/test |
Complied byte code | ${basedir}/target |
distributable JAR | ${basedir}/target/classes |
为了构建工程,Maven 为开发者提供了选项来配置生命周期目标和工程依赖(依赖于 Maven 的插件扩展功能和默认的约定)。大部分的工程管理和构建相关的任务是由 Maven 插件完成的。
Maven 的安装 window mac
在安装 IDEA 开发工具的时候,默认包含了 Maven 的安装,当前版本一般安装了 Maven2 和 Maven3。当然我们也是可以独立安装最新版本的 Maven。
window 下的 Maven 安装
- 从官方网站下载(http://maven.apache.org/download.cgi)
- 解压,如果解压到 C:\maven3.6,注意确保您安装了 Java JDK。
- 设置环境变量
M2_HOME = C:\maven3.6
Path 添加 %M2_HOME%/bin
测试一下 使用 Ctrl+R 打开 cmd 窗口,输入
mvn -version
mac 下的 Maven 安装
- 从官方网站下载(http://maven.apache.org/download.cgi)
- 解压,如果解压到 \home\maven3.6,注意确保您安装了 Java JDK。
- 设置环境变量
export MAVEN_HOME=/Users/zhang/Documents/apache-maven-3.6
export PATH=${MAVEN_HOME}/bin:$PATH
输入 source source /etc/profile 使得程序生效
测试一下 打开终端窗口
mvn -v
Maven 的 Pom.xml
什么是“坐标”?
在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。
groupId
和 artifactId
构成了一个Jar包的坐标
org.apache.poi
poi-ooxml
3.9
- groupId:所需Jar包的项目名
- artifactId:所需Jar包的模块名
- version:所需Jar包的版本号
传递依赖 与 排除依赖
- 传递依赖:如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和简洁引用的Jar包都下载到本地。
- 排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)
依赖范围 scope
在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。
- compile :默认范围,用于编译
- provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
- runtime: 在执行时需要使用
- test: 用于test任务时使用
- system: 需要外在提供相应的元素。通过systemPath来取得
- systemPath: 仅用于范围为system。提供相应的路径
- optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用
依赖冲突
若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。
- 短路优先
例如下面的引用关系如下:
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar
本项目——>A.jar——>B.jar——>X.jar
那么下面中引用的是 C.jar 中的 X.jar
在此时,Maven只会引用引用路径最短的Jar。
- 声明优先
若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。而不是后声明的覆盖前面的。
聚合
- 什么是聚合?
将多个项目同时运行就称为聚合。
- 如何实现聚合?
只需在 pom 中作如下配置即可实现聚合:
web-connection-pool
web-java-crawler
继承
- 什么是继承?
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。
- 如何实现继承?
-父 pom 配置如下
cn.missbe.web.search
resource-search
pom
1.0-SNAPSHOT
- 子项目 pom 配置
父pom所在项目的groupId
父pom所在项目的artifactId
父pom所在项目的版本号
resource-search
cn.missbe.web.search
1.0-SNAPSHOT
Maven 命令
- -v:查询Maven版本
本命令用于检查maven是否安装成功。
Maven安装完成之后,在命令行输入mvn -v,若出现maven信息,则说明安装成功。
- compile:编译
将java源文件编译成class文件
- test:测试项目
执行test目录下的测试用例
- package:打包
将项目打成jar包
-
clean:删除target文件夹
-
install:安装
将当前项目放到Maven的本地仓库中。供其他项目使用
我们可以使用 mvn clean install 来发布我们的基于 maven 的 spring boot 项目
使用Maven构建Web项目
通常我们使用 IDEA 构件 Maven项目
pom.xml 节点注解说明
4.0.0
cn.missbe.web
search-resources
war
1.0-SNAPSHOT
search-resources
http://www.missbe.cn
A maven project to study maven.
......
......
banseon-repository-proxy
banseon-repository-proxy
http://192.168.1.169:9999/repository/
default
......
org.apache.maven
maven-artifact
3.8.1
jar
test
spring-core
org.springframework
true
......
banseon-maven2
banseon maven2
file://${basedir}/target/deploy
banseon-maven2
Banseon-maven2 Snapshot Repository
scp://svn.baidu.com/banseon:/usr/local/maven-snapshot
banseon-site
business api website
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web