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