【全网最全】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来完成私服的搭建。

相关推荐
m0_571957582 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
丁总学Java2 小时前
页面、组件、应用、生命周期(微信小程序)
微信小程序·小程序·生命周期
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2344 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
测开小菜鸟5 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity6 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天6 小时前
java的threadlocal为何内存泄漏
java
caridle7 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^7 小时前
数据库连接池的创建
java·开发语言·数据库