简介:收集整理了网上关于Maven的面试问题,准备面试使用,答案通过各种资料查证编写。

  1.什么是Maven?

   Maven主要服务于基于java平台的项目构建,依赖管理和项目信息管理。Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统和用来运行定义在生命周期阶段中插件目标的逻辑。当使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自于一组共享的(或自定义的)插件。

  2.为什么选用Maven进行构建?(能为我们解决什么问题?)

   ①添加第三方jar包

    按照最原始的做法,我们是手动复制jar包到项目WEB-INF/lib下,每个项目都会有一份,造成大量重复文件。而Maven将jar包放在本地仓库中统一管理,需要jar包只需要用坐标的方式引用即可。

   ②jar包之间的依赖关系

    jar包之间往往不是独立的,很多jar需要在其他jar包的支持下才能够正常工作,称为jar包之间的依赖关系。如果我们手动去导入,要知道jar包之间的依赖关系并一一导入是及其麻烦而且容易出错的。如果使用Maven,它能够将当前jar包所依赖的其他所有jar包全部导入。

   ③获取第三方jar包

    开发过程中我们需要用到很多jar包,每个jar包在官网获取的方式不尽相同,给工作带来了额外困难。但是使用Maven可以以坐标的方式依赖一个jar包,Maven从中央仓库进行下载,并同时下载这个jar包依赖的其他jar包。

   ④将项目拆分为多个工程模块

    项目的规模越来越大,已经不可能通过package结构来划分模块,必须将项目拆分为多个工程协同开发。

  3.Maven的优点

   ①简化了项目依赖管理

   ②易于上手,对于新手来说了解几个常用命令即可满足日常工作

   ③便于与持续集成工具(jenkins)整合

   ④便于项目升级,无论是项目本身还是项目使用的依赖

   ⑤maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等

   ⑥为什么使用Maven中的各点

  4.Maven的缺点

   ①Maven是一个庞大的构建系统,学习难度大。(很多都可以这样说,入门容易[优点]但是精通难[缺点])

   ②Maven采用约定约定优于配置的策略,虽然上手容易但是一旦出现问题,难于调试

   ③中国网络环境较差,很多repository无法访问

  5.什么是Maven的坐标

   Maven的坐标通过groupId,artifactId,version唯一标志一个构件。groupId通常为公司或组织名字,artifactId通常为项目名称,versionId为版本号。

  6.通过坐标如何定位地址

   加上groupId为org.codehaus.mojo,artifactId为myproject,versionId为v1.0.0,则对应地址为:仓库目录(.m2)/org/codehaus/mojo/myproject/v1.0.0

  7.Maven的依赖范围有哪些(在scope中指定)

   compile:默认范围,如果未指定任何范围,则使用该范围。编译依赖项在所有(编译,测试,运行)类路径中都可用。此外,这些依赖关系会传播到依赖的项目

   provided:这很像compile,但表示您希望JDK或容器在运行时提供它。它只在编译和测试类路径上可用,不可传递。

   runtime:此范围表示编译不需要依赖项,但需要执行依赖项。它在运行时和测试类路径中,但不在编译类路径中。(servlet-api)

   test:表示应用程序的正常使用不需要依赖项,并且仅在测试编译和执行阶段可用。它不是传递的。(jdbc)

   system:系统依赖范围。该依赖与三种classpath的关系和provided依赖范围完全一致。但是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植。

  8.Maven生命周期

   有三套什么周期,分别为clean,default,site

   clean:

    此生命周期旨在给工程做清理工作,它主要包含以下阶段:

    pre-clean - 执行项目清理前所需要的工作。

    clean - 清理上一次build项目生成的文件。

    post-clean - 执行完成项目清理所需的工作。

   default:

    validate - 验证项目是否正确且所有必要的信息都可用。

    initialize - 初始化构建工作,如:设置参数,创建目录等。

    generate-sources - 为包含在编译范围内的代码生成源代码.

    process-sources - 处理源代码, 如过滤值.

    generate-resources -

    process-resources - 复制并处理资源文件,至目标目录,准备打包。

    compile - 编译项目中的源代码.

    process-classes - 为编译生成的文件做后期工作, 例如做Java类的字节码增强.

    generate-test-sources - 为编译内容生成测试源代码.

    process-test-sources - 处理测试源代码。

    generate-test-resources -

    process-test-resources - 复制并处理资源文件,至目标测试目录。

    test-compile - 将需测试源代码编译到路径。一般来说,是编译/src/test/java目录下的java文件至目标输出的测试classpath目录中。

    process-test-classes -

    test - 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。

    prepare-package -

    package - 接受编译好的代码,打包成可发布的格式,如 JAR 。

    pre-integration-test -

    integration-test - 按需求将发布包部署到运行环境。

    post-integration-test -

    verify -

    install -将包安装到本地仓库,给其他本地引用提供依赖。

    deploy -完成集成和发布工作,将最终包复制到远程仓库以便分享给其他开发人员。

   site:

    pre-site - 执行一些生成项目站点前的准备工作。

    site - 生成项目站点的文档。

    post-site - 执行需完成站点生成的工作,如站点部署的准备工作。

    site-deploy - 向制定的web服务器部署站点生成文件。

  9.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项目文件

   mvnjetty:run 启动jetty服务

   mvntomcat:run 启动tomcat服务

   mvn clean package -Dmaven.test.skip=true:清除以前的包后重新打包,跳过测试类

  10.依赖的解析机制

   当依赖的范围是 system 的时候,Maven 直接从本地文件系统中解析构件。

   根据依赖坐标计算仓库路径,尝试直接从本地仓库寻找构件,如果发现对应的构件,就解析成功。

   如果在本地仓库不存在相应的构件,就遍历所有的远程仓库,发现后,下载并解析使用。

   如果依赖的版本是 RELEASE 或 LATEST,就基于更新策略读取所有远程仓库的元数据文件(groupId/artifactId/maven-metadata.xml),将其与本地仓库的对应元合并后,计算出 RELEASE 或者 LATEST 真实的值,然后基于该值检查本地仓库,或者从远程仓库下载。

   如果依赖的版本是 SNAPSHOT,就基于更新策略读取所有远程仓库的元数据文件,将它与本地仓库对应的元数据合并,得到最新快照版本的值,然后根据该值检查本地仓库,或从远程仓库下载。

   如果最后解析得到的构件版本包含有时间戳,先将该文件下载下来,再将文件名中时间戳信息删除,剩下 SNAPSHOT 并使用(以非时间戳的形式使用)。

  11.插件的解析机制

   与依赖的构件一样,插件也是基于坐标保存在Maven仓库中。在用到插件的时候会先从本地仓库查找插件,如果本地仓库没有则从远程仓库查找插件并下载到本地仓库。与普通的依赖构件不同的是,Maven会区别对待普通依赖的远程仓库与插件的远程仓库。前面提到的配置远程仓库只会对普通的依赖有效果。当Maven需要的插件在本地仓库不存在时是不会去我们以前配置的远程仓库查找插件的,而是需要有专门的插件远程仓库。

  12.如何聚合多模块

   配置一个打包类型为pom的聚合模块,然后在该pom中使用<module>元素声明要聚合的模块。

  13.如何管理多模块项目依赖的版本

   通过在父模块中声明dependencyManagement和pluginManagement, 然后让子模块通过<parent>元素指定父模块,这样子模块在定义依赖是就可以只定义groupId和artifactId,自动使用父模块的version,这样统一整个项目的依赖的版本。

  14.如何解决依赖传递引起的版本冲突

   可通过dependency的exclusion元素排除掉依赖

  15.Maven依赖原则

   ①最短路径原则(依赖传递的路径越短越优先)

   ②pom文件申明顺序优先(路径长度一样,则先申明的优先)

   ③覆写原则(当前pom文件里申明的直接覆盖父工程传过来的)

  16.Maven版本规则

   主版本.次版本.增量版本

   主版本:一般来说代表了项目的重大的架构变更

   次版本:一般代表了一些功能的增加或变化,但没有架构的变化

   增量版本:一般是一些小的 bug fix ,不会有重大的功能变化

Maven笔记之面试题合集的更多相关文章

  1. Struts+Hibernate+Spring面试题合集及答案

    Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 2 ...

  2. Mybatis面试题合集及答案

    Mybatis面试题合集及答案 1.#{}和${}的区别是什么? 答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态 ...

  3. Java 分布式框架面试题合集

    Java 分布式框架面试题合集 1.什么是 ZooKeeper? 答:ZooKeeper 是一个开源的分布式应用程序协调服务,是一个典型的分布式数据一致性解决方案.设计目的是将那些复杂且容易出错的分布 ...

  4. Struts+Hibernate+Spring面试题合集及答案(转)

    Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring 面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 ...

  5. 2020阿里,字节跳动,JAVA岗(一线企业校招、社招)面试题合集

    前言 以下面试题全属于一线大厂社招以及校招的面试真题,各位在做这些题目对照自己的时候请平凡心对待,不要信心受挫.其实 做为致力于一线企业校招或者社招的你来说,能把每个知识模块的一小部分问题去深入学习和 ...

  6. 【转】Java面试题合集

    2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...

  7. Linux 运维工程师经典面试题合集(不断更新中 ...)

    写在前面的话 做运维以来,关注了很多关于互联网技术,培训等乱七八糟的公众号,时不时的就会推一些各种公司的面试题过来. 大致看了一下,发现自己很多知识要么遗忘了,要么很难说出个所以然,所以这里对那些个人 ...

  8. 9月最新184道阿里、百度、腾讯、头条Java面试题合集

    阿里面试题 1. 如何实现一个高效的单向链表逆序输出? 2. 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt(2)精确到小数点后10位 3. 给定一个二叉搜索树(BST),找到树中第 ...

  9. 手撕面试官系列(一):spring108道面试题合集

    前言 想必各位程序员已经开始准备金九银十的秋招了,创建这个这个系列文章的目的就是为了帮助大家解决面试的问题,系列文章将会一直更新,大家如果觉得不错可以关注我并转发,让更多程序兄弟看到~接下来我们进入正 ...

随机推荐

  1. Java Bean拷贝工具Orika原理解析

    最近面试被问及对象拷贝怎样才能高效,实际上问的就是Orika或者BeanCopier的原理.由于网上对Orika原理的解析并不太多-因此本文重点讲解一下Orika的原理.(Orika是基于JavaBe ...

  2. 虚拟机VMware15 Ubuntu18.04 搭建FTP服务器

    1.安装vsftpd sudo apt install vsftpd 2.查看是否安装成功,出现版本等信息即成功 sudo vsftpd -v 3.添加ftp用户 sudo useradd -m su ...

  3. gsap基础一[from,to,fromTo]

    学了几天基础了,感觉总算有点入了一个门的感觉啦,gasp不难,想想一年前我看着官网跟天文一样,今年真的进步很大,在外网发现学习的新世界, 自己的获取知识和查看api源码的能力也增强了许多,现在国内的气 ...

  4. moviepy音视频开发:音频文件存取类AudioFileClip属性和方法介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 AudioFileClip是AudioClip的直接子类,用于从一个音频文件或音频数组中读入音频到内存构建音频剪辑.但AudioFileClip并不 ...

  5. espcms代码审计第一弹

    以前的代码审计都是在CTF比赛题里面进行对于某一段代码的审计,对于后端php整体代码和后端整体架构了解的却很少,所以有空我都会学习php的代码审计,以提高自己 环境就直接用的是phpstudy,学习的 ...

  6. NodeService Ensure that Node.js is installed and can be found in one of the PATH directories

    今天发布NodeService到服务器,服务器环境是window server 2012 一直报错: [1] Ensure that Node.js is installed and can be f ...

  7. day105:Mofang:设置页面初始化&更新头像/上传头像&设置页面显示用户基本信息

    目录 1.设置页面初始化 2.更新头像 1.点击头像进入更新头像界面 2.更新头像页面初始化 3.更新头像页面CSS样式 4.头像上传来源选择:相册/相机 5.调用api提供的本地接口从相册/相机提取 ...

  8. 团队作业part3--需求改进&系统设计

    一.需求&原型改进 1. 需求的修改 借鉴其他开发游戏的组的经验以及老师的建议,针对之前的需求分析,作出如下修改: 问题1:这款游戏对玩家的吸引力与驱动性有所不足. 修改1:增加成就系统与排行 ...

  9. 01_02_py

    1基础知识 1.自然语言 (natural language) 是人们交流所使用的语言,例如英语.西班牙语和法语.它们不是人为设计出来的(尽管有人试图这样做):而是自然演变而来. 2.形式语言 (fo ...

  10. 珍藏的C语言编程系列教程

    本文有332个文字,大小约为2KB,预计阅读时间1分钟 这是本人珍藏的C语言.C++系列教程. 相信每个Coder的第一门编程语言就是C语言吧, 现在也依然很热门,不谈了.直接上链接,感兴趣的直接存, ...