持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
什么是 Maven
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
为什么使用 Maven
| 标题 | 使用 maven 工具 |
|---|---|
| 一个项目就是一个工程,当项目很庞大时,完全用package去划分,显得过于复杂 | Maven可以把一个大的项目拆分成多个工程,分工协作,且相互之间能互相访问 |
| 不同的工程中,存储着许多相同的jar包。浪费存储,且项目臃肿 | Maven可以将jar包保存在“仓库”中,工程只需要引用即可,不需要在工程中存储 |
| 需要自己去寻找jar包,有些官网甚至只支持maven下载。 | 所有知名框架及第三方工具jar包都已经按照规范放入了Maven的中央仓库,使用Maven下载安全,便捷 |
| 需要花时间了解jar包之间的依赖关系。然后去下载依赖的jar包 | 借助Maven,自动分析jar包的依赖关系,并自动添加到项目中来 |
常用命令
| 命令 | 描述 |
|---|---|
| mvn clean | 对项目进行清理,删除target目录下编译的内容 |
| mvn compile | 编译项目源代码 |
| mvn test | 对项目进行运行测试 |
| mvn package | 打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的class文件 |
| mvn install | 在本地仓库生成仓库的安装包,可供其他项目引用,同时打包后的文件放到项目的target目录下 |
常用命令使用场景举例
- mvn clean package
依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段 package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
- mvn clean install
依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段 install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
- mvn clean deploy
依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
仓库管理
- 本地仓库:当前电脑上部署的 仓库目录
- 私服:架设在局域网环境中,为局域网范围内 的所有Maven工程服务
- 中央仓库:架设在Internet上,为全世界的Maven工程服务
- 中央仓库镜像:架设在各大洲,为了分担中央仓库的流量,更快响应用户
依赖的范围
| 主程序是否需要 | 测试程序是否需要 | 是否参与打包 | 备注 | |
|---|---|---|---|---|
| compile | 是 | 是 | 是 | 编译依赖的jar包,主程序和测试程序都可以使用。 |
| test | 否 | 是 | 否 | 测试程序并不需要打包,所以其依赖包也不需要打包 |
| provided | 是 | 是 | 否 | 例如Servlet的jar包,开发和测试都需要,但是真正部署时,Servlet容器自己会提供。并不需要打包。 |
依赖的排除
定义:工程A依赖工程B,工程B依赖b.jar。若工程A中不想要b.jar,则需要配置依赖的排除信息。
配置信息:
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
</dependency>
生命周期
Maven 拥有三套相互独立的生命周期: clean、default 和 site, 而每个生命周期包含一些phase阶段, 阶段是有顺序的, 并且后面的阶段依赖于前面的阶段. 而三套生命周期相互之间却并没有前后依赖关系, 即调用site周期内的某个phase阶段并不会对clean产生任何影响.
clean
clean生命周期的目的是清理项目:
执行如$ mvn clean;
default
default生命周期定义了真正构建时所需要执行的所有步骤:
执行如$ mvn clean install;
site
site生命周期的目的是建立和发布项目站点: Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息
执行命令如$ mvn clean deploy site-deploy;
依赖配置
在POM里面的dependencies下面添加依赖配置。
如下是我的demo项目的pom中引入的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
配置文件在仓库中寻找,下面就来介绍仓库。
仓库
在Maven中,仓库是用来存放依赖文件的地方,是依赖管理的重要组成部分。仓库按照存放位置可以分为本地仓库,远程仓库以及中央仓库。
本地仓库
本地仓库,就是本地开发自己机器上的仓库。在idea的settings中我们可以查看自己本地仓库的位置。
中央仓库
Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。
中央仓库的关键概念:
- 这个仓库由 Maven 社区管理。
- 不需要配置。
- 需要通过网络才能访问。
远程仓库
当条件限制,不允许在中央仓库下载依赖,那么组织可以自己定制一个远程仓库,让所有开发都从此仓库下载。定义好远程仓库后,然后修改POM文件即可:
<repositories>
<repository>
<id>companyname.lib1</id>
<url>http://download.companyname.org/maven2/lib1</url>
</repository>
<repository>
<id>companyname.lib2</id>
<url>http://download.companyname.org/maven2/lib2</url>
</repository>
</repositories>
依赖下载顺序
当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:
- 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
- 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
- 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
- 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。