【全网最全】Maven面试题

目录

一、Maven是什么?为什么要用它?

二、Maven添加依赖需要什么标签?

三、说一说Maven的生命周期,分别是什么命令?

四、Maven都有哪些依赖范围?

五、说一说什么是Maven的依赖传递?

六、什么是Maven的继承?

七、何为Maven的聚合?

八、了解Maven的私服吗?为什么使用私服?如何实现?


一、Maven是什么?为什么要用它?

  1. 我们先想象一个场景,以前我们开发web程序都用手动引入jar包的方式,这样非常麻烦,每次都要从网站上下载再引入,而且有些jar包还需要依赖其余的jar包。比如我们引入spring的jar包,那么就还得下载jackson的jar包,也就是说,你必须要了解这些jar包的依赖关系,你才能不报错。而maven会自动帮你解决这些jar包之间的依赖关系,也能自动帮你下载jar包到你本地的仓库。
  2. 还有就是构建war包的问题,有个开发经验的小伙伴们儿都知道我们Javaweb项目如果想部署到服务器上,就要打成war包的形式放在Tomcat下,以前没有maven的时候我们大多使用idea或者eclipse去构建,但这样有个问题,我们很多时候服务器是Linux系统,命令行的界面,根本无法使用idea等工具帮我们构建,这时maven就能帮我们解决这个问题。

总结:

  1. maven自动从网站下载jar包,并帮你管理jar与jar之间的依赖关系。
  2. 会帮你打包,构建成jar包或war包。

二、Maven添加依赖需要什么标签?

分别是<groupId>、<artifactId>、<version>标签。

三、说一说Maven的生命周期,分别是什么命令?

命令 描述
mvn compile 编译项目,生成target文件
mvn package 打包项目,生成jar或war文件
mvn clean 清理编译或打包后的项目结构
mvn install 打包后上传到maven本地仓库
mvn deploy 只打包,上传到maven私服仓库
mvn site 生成站点
mvn test 执行测试源码

四、Maven都有哪些依赖范围?

依赖范围 描述
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 中。

比如Junit的依赖,只会在测试阶段使用,打包发布到服务器根本用不到它,所以不用将此打包,可以设置依赖范围为test。

五、说一说什么是Maven的依赖传递?

假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C--->B--->A, 那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是依赖的传递性。

六、什么是Maven的继承?

Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。

父级maven项目配置<dependencyManagement>标签,里面配置各种依赖信息,子maven项目可以通过<parent>来继承父级项目,再显式的声明依赖,可以不写版本号。

七、何为Maven的聚合?

Maven 聚合是指将多个项目组织到一个父级项目中,以便一起构建和管理的机制。聚合可以帮助我们更好地管理一组相关的子项目,同时简化它们的构建和部署过程。

通过聚合,可以在一个命令中构建和发布多个相关的项目,简化了部署和维护工作。

通过聚合,可以在父项目中管理公共依赖项和插件,避免重复定义。

父maven项目中通过<modules>标签来实现聚合,如下:

XML 复制代码
<project>
  <groupId>com.example</groupId>
  <artifactId>parent-project</artifactId>
  <packaging>pom</packaging>
  <version>1.0.0</version>
  <modules>
    <module>child-project1</module>
    <module>child-project2</module>
  </modules>
</project>

八、了解Maven的私服吗?为什么使用私服?如何实现?

Maven 私服是架设在局域网内的仓库,如果没有私服,我们下载依赖一般默认去中央仓库下载。

maven找依赖jar包是通过 本地仓库 ------> maven私服仓库 ------> 中央仓库 的顺序去下载,如果本地仓库有就直接返回,没有则去私服仓库找,如果还没有则去中央仓库下载。

因为私服位于局域网内,从私服下载构建更快更稳定。而且有时候我们会自己封装一些jar包,更适合传到私服中,供同事进行下载。

当前最流行的私服产品是Nexus,我会使用Nexus来完成私服的搭建。

相关推荐
一只韩非子1 天前
Spring AI Alibaba 快速上手教程:10 分钟接入大模型
java·后端·ai编程
叫我阿柒啊1 天前
从Java全栈到云原生:一场技术深度对话
java·spring boot·docker·微服务·typescript·消息队列·vue3
ONLYOFFICE1 天前
【技术教程】如何将文档编辑器集成至基于Java的Web应用程序
java·编辑器·onlyoffice
保卫大狮兄1 天前
连锁零售企业如何能更有效地管理门店考勤?
面试·职场和发展
lbwxxc1 天前
手写 Tomcat
java·tomcat
CHEN5_021 天前
【CouponHub项目开发】使用RocketMQ5.x实现延时修改优惠券状态,并通过使用模板方法模式重构消息队列发送功能
java·重构·模板方法模式·项目
杨杨杨大侠1 天前
实战案例:商品详情页数据聚合服务的技术实现
java·spring·github
杨杨杨大侠1 天前
实战案例:保险理赔线上审核系统的技术实现
java·spring·github
计算机毕设定制辅导-无忧学长1 天前
MQTT 与 Java 框架集成:Spring Boot 实战(一)
java·网络·spring boot
叫我阿柒啊1 天前
从Java全栈到Vue3实战:一次真实面试的深度复盘
java·spring boot·微服务·vue3·响应式编程·前后端分离·restful api