maven讲解

531 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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目录下

常用命令使用场景举例

  1. mvn clean package

依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段 package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

  1. mvn clean install

依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段 install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库

  1. 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中我们可以查看自己本地仓库的位置。

image.png

中央仓库

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 将停止处理并抛出错误(无法找到依赖的文件)。