1. 什么是Maven?
  • Maven是一个开源的项目管理和构建工具,用于帮助开发人员自动化构建、测试和部署Java项目。它提供了一个标准化的项目结构和一套强大的构建规则,以及丰富的插件生态系统,使得项目的构建和依赖管理变得简单和可靠。
  • Maven的核心概念包括项目对象模型(Project Object Model,POM)、坐标、依赖管理和生命周期。项目对象模型是一个XML文件,描述了项目的基本信息、依赖信息、插件配置等。
  • 依赖管理功能可以让开发人员方便的生命和管理项目所依赖的外部库和模块。生命周期定义了一系列的构建阶段和插件目标,开发人员可以根据需求执行不同的构建任务。
  1. Maven能为我们解决什么问题?
  1. 添加第三方jar包
    • 使用Maven之前,我们都是手动复制jar包到项目的WEB-INF/lib下,每个项目都会有一份,造成大量重复文件。而Maven将jar包放在本地仓库中统一管理,需要jar包只需要用坐标的方式引用即可。
  2. jar包之间的依赖关系
    • jar包之间往往是不独立的,很多jar包需要在其他jar包的支持下才能够正常工作,成为jar包之间的依赖关系,如果我们手动去导入,要知道jar包之间的依赖关系并一一导入,这样是极其麻烦而且容易出错的。如果我们使用maven,它能够将当前jar包所依赖的其他所有jar包全部导入。
  3. 获取第三方jar包
    • 开发过程中我们需要用到很多jar包,每个jar包在官网的获取方式不尽相同,给工作带来了额外的困扰。但是使用Maven可以以坐标的方式依赖一个jar包,Maven从中央仓库进行下载,并同时下载这个jar包依赖的其他jar包
  4. 将项目拆分为过个工程模块
    • 随着项目的规模越来越大,已经不可能通过package结构来划分模块,必须将项目拆分为多个工程协同开发。
  1. 说说Maven有什么优缺点?
  • 优点
    1. 简化了项目依赖管理
    2. 易于上手,对于新手来说,了解几个常用命令即可满足日常工作需求
    3. 便于与持续集成工具(jenkins)整合
    4. 便于项目升级,无论是项目本身还是项目使用的依赖
    5. maven有很多插件,便于功能扩展,例如生产站点、自动发布版本等
  • 缺点
    • Maven是一个庞大的构建系统,学习难度大,入门容易但精通难
    • Maven采用约定大于配置的策略,虽然上手容易,但一旦出现问题,很难调试(例如网络环境较差,导致很多repository无法访问)
  1. 什么是Maven的坐标?
  • Maven坐标是用于唯一标识一个项目或模块的信息,它由一组固定的属性组成,包括groupId、artifactId和Version
    • groupId(组织名称):用于表示项目所属的组织或团队,一般情况下,它的命名是翻转的域名(com.example),但也可以根据实际需求来自定义。
    • artifactId(项目组织):artifactId是指项目的唯一标识符,用于区分不同的项目。它通常是项目的名称,用于在仓库中唯一标识一个项目,在同一个groupId下,不同的项目应该有不同的artifactId
    • version(版本号):version表示项目的版本号。它用于区分不同版本的项目,以便在依赖管理和构建过程中正确选择和使用。版本号可以采用标准的数字格式(例如1.0、2.1.7)或其他约定的格式。
  • 通过组合这些属性,Maven的坐标提供了一种唯一标识的定位项目的方式。在依赖管理中,其他项目可以通过引用该坐标来声明对该项目的依赖。Maven会根据这些坐标信息,自动下载并引入所需的依赖项。
  1. 讲一下maven的生命周期
阶段处理描述
validate验证项目验证项目是否正确且所有必须信息是可用的
compile执行编译源代码编译在此阶段完成
test测试使用适当的单元测试框架(例JUnit)运行测试
package打包创建JAR/WAR包如在 pom,xml 中定义提及的包
verify检查对集成测试的结果进行检查,以保证质量达标
install安装安装打包的项目到本地仓库,以供其他项目使用
deploy部署拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
  1. 说说你熟悉哪些maven命令?
Maven 命令功能
mvn archetype:generate创建 Maven 项目
mvn compile编译源代码
mvn deploy发布项目
mvn test-compile编译测试源代码
mvn test运行应用程序中的单元测试
mvn site生成项目相关信息的网站
mvn clean清除项目目录中的生成结果
mvn package根据项目生成的 JAR
mvn install在本地 Repository 中安装 JAR
mvn eclipse:eclipse生成 Eclipse 项目文件
mvn jetty:run启动 Jetty 服务
mvn tomcat:run启动 Tomcat 服务
mvn clean package -Dmaven.test.skip=true清除以前的包后重新打包,跳过测试类
  1. 如何解决依赖传递引起的版本冲突?

可以通过在依赖项声明中使用<exclusions>标签来排除特定的传递依赖项。

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>com.example</groupId>
<artifactId>example-library</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>conflicting-group</groupId>
<artifactId>conflicting-artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
  1. 说说maven的依赖原则
  1. 最短路径原则(依赖传递的路径越短越优先)
  2. pom文件申明顺序优先(路径长度一样,则先申明的优先)
  3. 覆写原则(当前pom文件里申明的直接覆盖父工程传过来的)
  1. 说说依赖的解析机制
  1. 读取POM文件:Maven首先读取项目的POM文件,其中包含了项目依赖的配置信息。
  2. 解析依赖坐标:Maven解析POM文件中的依赖坐标,包括groupId、artifactId和version等信息,这些坐标唯一标识了一个依赖项。
  3. 检查本地仓库:Maven首先检查本地仓库(通常位于用户目录的.m2目录下),看是否已经存在所需的依赖项。如果已经存在,并且版本匹配,则直接使用本地仓库中的依赖项,无需下载。
  4. 下载依赖项:如果本地仓库中不存在所需的依赖项,或者版本不匹配,Maven会尝试从配置的远程仓库(如Maven中央仓库)下载依赖项。Maven会根据依赖坐标构建远程仓库的URL,下载相应的JAR文件。
  5. 解析依赖关系:Maven解析依赖项的传递关系。它会检查所下载的依赖项的POM文件,找到他们的传递依赖项,并重复以上步骤来解析和下载传递依赖项。
  6. 版本冲突解决:当存在多个依赖项的不同版本时,Maven使用冲突解决机制来确定最终使用的版本。通常会选择路径最短的依赖项(最短路径原则)或者根据POM文件中声明顺序选择优先的版本。
  7. 构建依赖树:Maven根据解析结果构建一个依赖树,表示项目的依赖关系和层次结构。这个依赖树包括直接依赖和传递依赖。
  8. 传递依赖管理:Maven会将解析的依赖项添加到项目的类路径中,以便在编译、测试和运行时使用。它还会管理传递依赖的范围和冲突解决。