前言
Maven入门,把学习过程做个记录。
正文
一.Maven简介
1.1Maven是什么?
Maven简单翻译为"内行","专家",是Apache的一个Java开发的开源项目,是一个项目管理工具.Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
1.2Maven主要功能
- 提供了一套标准化的项目结构
- 提供了一套标准化的构建流程(编译,测试,打包,发布……);
- 提供了一套依赖管理机制。
1.3Maven核心
- 依赖管理: 对 jar 的统一管理(Maven 提供了一个 Maven 的中央仓库,当我们在项目中添加完会自动去中央仓库下载相关的依赖,并且解决依赖的依赖问题)
- 项目构建: 对项目进行编译、测试、打包、部署、上传到私服等
二.Maven安装和使用
2.1 Maven下载,安装
* 下载
Maven官网下载: https://maven.apache.org/download.cgi
* 安装
解压即可运行
* 目录
bin:存放Maven的命令
boot: 存放Maven的引导程序,如类加载器
conf: 存放了Maven的一些配置文件,如setting.xml文件
lib: jar包
* 环境变量:
MAVEN_HOME: maven安装目录
path: %MAVEN_HOME%\bin
* 验证:
CMD中输入mvn --version
**
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: D:\APP\apache-maven-3.8.6-bin\apache-maven-3.8.6
**
2.2.Maven仓库
2.2.1仓库类型与配置
-
本地仓库 默认情况下,每个本地计算机的用户目录下都有一个路径名为.m2/repository/的仓库目录,这个就是本地的仓库,也可以在 settings.xml 文件配置本地仓库的路径.
<!-- 本地仓库 --> <localRepository>D:\APP\apache-maven-3.8.6-bin\repositoryre\repository_boot</localRepository>
-
远程仓库 远程仓库也称为私服,由公司或者项目组维护,是开发人员自己定义的远程仓库,其中包含项目所需要的库或其他的jar包,可以通过标签来制定远程仓库地址.
<!-- settings.xml 中配置镜像仓库 --> <mirrors> <!-- 阿里云仓库 --> <mirror> <id>all</id> <mirrorOf>all</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror> <!-- 中央仓库1 --> <mirror> <id>repo1</id> <mirrorOf>all</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo1.maven.org/maven2/</url> </mirror> <!-- 中央仓库2 --> <mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror> </mirrors>
-
中央仓库是Maven社区提供的仓库。它包含大量常用的库。当 Maven 在本地存储库中找不到任何依赖项时,就会从中央仓库中搜索.
2.2.2 仓库加载顺序
第 1 步- 在本地存储库中搜索依赖项,如果未找到,则转到第 2 步,否则执行进一步处理.
第 2 步- 如果没有提到远程存储库,则跳转到第 3 步.在一个或多个远程存储库中搜索依赖项,如果找到则将其下载到本地存储库以供将来参考.
第 3 步- 在中央存储库中搜索依赖项,将其下载到本地存储库以供将来参考。如果未找到 Maven 只是停止处理并抛出错误(无法找到依赖项).
2.2.3 Maven工程结构
三.Maven生命周期和插件
3.1 Maven常用命令和插件
-
clean: Maven清理命令, 执行clean会删除target目录及其内容
mvn clean
-
validate: 检查项目的正确性.
-
compile: Maven编译命令,将src/main/java下的文件编译为class文件输出到target目录下.
-
test: Maven测试命令,执行src/test/java的单元测试类,并编译为class文件.
-
package Maven打包命令,对java工程会打包为jar包,web工程打包为war包.
-
integration-test: 执行额外的测试,这需要打包.
-
verify: 检查包是否有效.
-
install: Maven安装命令,将Maven工程打包为jar包或者war包,并发布到本地仓库.
-
deploy: Maven工程部署命令,将jar包或war包部署到私服中.
3.2 Maven生命周期
Maven对项目的构建过程分为"三套相互独立的"生命周期:
1.Clean Lifecycle(清理生命周期):
构建之前的清理工作
命令: clean
2.Default Lifecycle(默认生命周期):
构建的核心部分,编译,测试,打包,部署等等(
命令: compile test package install deploy
3.Site Lifecycle(站点生命周期):
生成项目报告,发布站点
命令: site
四.IDEA创建Maven工程
4.1 IDEA配置本地Maven环境
4.2IDEA创建工程
- 新建项目
- 创建后,新建 src/main/java src/main/resources src/test/java src/test/resources
-
添加web模块并使用 JBLTOWEB转换为WEB工程
4.3 发布web工程
4.4 依赖范围
依赖范围 | 描述 |
---|---|
compile | 编译依赖范围,scope 元素的缺省值。使用此依赖范围的 Maven 依赖,对于三种 classpath 均有效,即该 Maven 依赖在上述三种 classpath 均会被引入。例如,log4j 在编译、测试、运行过程都是必须的。 |
test | 测试依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath 有效。例如,Junit 依赖只有在测试阶段才需要。 |
provided | 已提供依赖范围。使用此依赖范围的 Maven 依赖,只对编译 classpath 和测试 classpath 有效。例如,servlet-api 依赖对于编译、测试阶段而言是需要的,但是运行阶段,由于外部容器已经提供,故不需要 Maven 重复引入该依赖。 |
runtime | 运行时依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath、运行 classpath 有效。例如,JDBC 驱动实现依赖,其在编译时只需 JDK 提供的 JDBC 接口即可,只有测试、运行阶段才需要实现了 JDBC 接口的驱动。 |
system | 系统依赖范围,其效果与 provided 的依赖范围一致。其用于添加非 Maven 仓库的本地依赖,通过依赖元素 dependency 中的 systemPath 元素指定本地依赖的路径。鉴于使用其会导致项目的可移植性降低,一般不推荐使用。 |
import | 导入依赖范围,该依赖范围只能与 dependencyManagement 元素配合使用,其功能是将目标 pom.xml 文件中 dependencyManagement 的配置导入合并到当前 pom.xml 的 dependencyManagement 中。 |
依赖范围与三种 classpath 的关系一览表,如下所示。
依赖范围 | 编译 classpath | 测试 classpath | 运行 classpath | 例子 |
---|---|---|---|---|
compile | √ | √ | √ | log4j |
test | - | √ | - | junit |
provided | √ | √ | - | servlet-api |
runtime | - | - | √ | JDBC-driver |
system | √ | √ | - | 非 Maven 仓库的本地依赖 |
五. Maven的依赖传递
Maven 的依赖传递机制是指:不管 Maven 项目存在多少间接依赖,POM 中都只需要定义其直接依赖,不必定义任何间接依赖,Maven 会动读取当前项目各个直接依赖的 POM,将那些必要的间接依赖以传递性依赖的形式引入到当前项目中。Maven 的依赖传递机制能够帮助用户一定程度上简化 POM 的配置。
总结
通过以上的学习基本上就可以上手Maven了.