Maven 面试问题(Maven Interview Questions)
亲爱的读者,这些Maven Interview Questions专门设计用于让您了解在面对Maven主题时可能遇到的问题的性质。 根据我的经验,好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的内容:
通常,部署过程包括以下步骤 -
将正在进行的所有项目中的代码签入SVN或源代码存储库并对其进行标记。
从SVN下载完整的源代码。
构建应用程序。
将构建输出WAR或EAR文件存储到公共网络位置。
从网络获取文件并将文件部署到生产站点。
更新了包含应用程序的日期和更新版本号的文档。
Maven是一个项目管理和理解工具。 Maven为开发人员提供了完整的构建生命周期框架。 由于Maven使用标准目录布局和默认构建生命周期,开发团队几乎可以立即自动化项目的构建基础架构。
Maven使用约定优于配置,这意味着开发人员不需要自己创建构建过程。 开发人员不必提及每个配置细节。
Maven为开发人员提供管理以下方法的方法
- Builds
- Documentation
- Reporting
- Dependencies
- SCMs
- Releases
- Distribution
- 邮件列表
输入以下命令 -
mvn --version
POM代表项目对象模型。 它是Maven的基本工作单元。 它是一个XML文件。 它始终作为pom.xml驻留在项目的基本目录中。 它包含有关项目的信息以及Maven用于构建项目的各种配置详细信息。
POM包含以下一些配置信息 -
- 项目依赖
- plugins
- goals
- 建立档案
- 项目版本
- developers
- 邮件列表
工件是一个文件,通常是一个部署到Maven存储库的JAR。 Maven构建会生成一个或多个工件,例如已编译的JAR和“sources”JAR。
每个工件都有一个组ID(通常是反向域名,如com.example.foo),工件ID(只是一个名称)和一个版本字符串。 三者一起唯一地识别工件。 项目的依赖项被指定为工件。
构建生命周期是一个明确定义的阶段序列,它定义了目标的执行顺序。 这里阶段代表生命周期的一个阶段。
三个构建生命周期是 -
clean:清除先前构建创建的工件。
default (or build):这用于构建应用程序。
site:为项目生成站点文档。
输入命令 -
mvn site
在开始构建过程之前,此命令将删除包含所有构建数据的目标目录。
以下是阶段 -
validate −验证项目是否正确并且所有必要信息都可用。
compile −编译项目的源代码。
test −使用合适的单元测试框架测试编译的源代码。 这些测试不应要求打包或部署代码
package −获取已编译的代码并将其打包为可分发的格式,例如JAR。
integration-test −如有必要,将程序包处理并部署到可以运行集成测试的环境中。
verify −运行任何检查以验证包是否有效并符合质量标准。
install −将软件包安装到本地存储库中,以便在本地用作其他项目的依赖项。
deploy −在集成或发布环境中完成,将最终包复制到远程存储库以与其他开发人员和项目共享。
目标代表一项有助于项目建设和管理的特定任务。 它可能绑定到零个或多个构建阶段。 未绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。
此命令将清理项目,复制依赖项并打包项目(执行所有阶段直到package )。
清洁生命周期包括以下阶段 -
- pre-clean
- clean
- post-clean
Site Lifecycle的各个阶段是 -
- pre-site
- site
- post-site
- site-deploy
构建配置文件是一组配置值,可用于设置或覆盖Maven构建的默认值。 使用构建配置文件,您可以为不同的环境(例如Production v/s开发环境)自定义构建。
构建配置文件有三种类型 -
Per Project −在项目POM文件pom.xml中定义。
Per User −在Maven设置xml文件中定义(%USER_HOME%/。m2/settings.xml)。
Global −在Maven全局设置xml文件中定义(%M2_HOME%/ conf/settings.xml)
可以通过各种方式激活Maven构建配置文件 -
显式使用命令控制台输入。
通过maven设置。
基于环境变量(用户/系统变量)。
操作系统设置(例如,Windows系列)。
存在/丢失文件。
存储库是一个存储所有项目jar,库jar,插件或任何其他项目特定工件的目录,并且可以由Maven轻松使用。
Maven存储库有三种类型:本地,中央,远程
Maven本地存储库是计算机上的文件夹位置。 它是在第一次运行任何maven命令时创建的。 Maven本地存储库保存您项目的所有依赖项(库jar,插件罐等)。
〜/平方米。/库。
mvn安装
它是Maven社区提供的存储库。 它包含大量常用库。 当Maven在本地存储库中找不到任何依赖项时,它会使用以下URL开始在中央存储库中搜索:http://repo1.maven.org/maven2/。
有时,Maven在中央存储库中找不到提到的依赖项,然后它会停止构建过程并向控制台输出错误消息。 为了防止这种情况,Maven提供了Remote Repository的概念,它是开发人员自己的包含所需库或其他项目jar的自定义存储库。
以下是搜索模式 -
步骤1 - 在本地存储库中搜索依赖项,如果未找到,则移至步骤2,如果找到则执行进一步处理。
步骤2 - 在中央存储库中搜索依赖关系,如果未找到并且提到远程存储库/存储库,则移至步骤4,如果找到,则将其下载到本地存储库以供将来参考。
步骤3 - 如果没有提到远程存储库,Maven只是停止处理并抛出错误(无法找到依赖关系)。
步骤4 - 在远程存储库或存储库中搜索依赖关系,如果找到则将其下载到本地存储库以供将来参考,否则Maven将按预期停止处理并抛出错误(无法找到依赖关系)。
Maven插件习惯于 -
- 创建jar文件。
- 创建战争文件。
- 编译代码文件。
- 单元测试代码。
- 创建项目文档。
- 创建项目报告。
Maven提供以下两种类型的插件 -
Build plugins −它们在构建期间执行,应该在pom.xml的“build /”元素中配置
Reporting plugins −它们在站点生成期间执行,应该在pom.xml的“reporting /”元素中进行配置
使用Maven存储库(本地,中央,远程)概念的Maven依赖管理。 假设任何远程存储库和中央存储库都没有依赖关系; 在这种情况下,Maven使用外部依赖的概念。
外部依赖项(库jar位置)可以在pom.xml中以与其他依赖项相同的方式配置。
- 指定groupId与库名称相同。
- 指定artifactId与库名称相同。
- 将范围指定为系统。
- 指定相对于项目位置的系统路径。
Archetype是一个Maven插件,其任务是根据模板创建项目结构。
输入以下命令 -
mvn archetype:generate
SNAPSHOT是一个特殊版本,表示当前的开发副本。 与常规版本不同,Maven在每个构建的远程存储库中检查新的SNAPSHOT版本。
对于Version,如果Maven下载了上面提到的版本数据服务:1.0,它将永远不会尝试下载存储库中可用的较新的1.0。 要下载更新的代码,数据服务版本将升级到1.1。
在SNAPSHOT的情况下,每当app-ui团队建立他们的项目时,Maven将自动获取最新的SNAPSHOT(数据服务:1.0-SNAPSHOT)。
传递依赖意味着避免需要发现和指定您自己的依赖项所需的库,并自动包含它们。
它意味着直接指定在传递依赖项中遇到它们时要使用的工件的版本。 对于示例项目,C可以在其dependencyManagement部分中包括B作为依赖项,并且直接控制在引用它时使用哪个版本的B.
当遇到多个版本的工件时,Maven确定要使用哪个版本的依赖项。 如果两个依赖版本在依赖关系树中处于相同的深度,则将使用第一个声明的依赖关系。 这称为依赖中介。
依赖关系范围包括根据构建的当前阶段的依赖关系。 各种依赖范围是 -
compile −此范围指示项目的类路径中的依赖项可用。 它是默认范围。
provided −此范围表示JDK或web-Server/Container在运行时提供依赖关系。
runtime −此范围指示编译不需要依赖项,但在执行期间是必需的。
test −此范围表示依赖项仅适用于测试编译和执行阶段。
system −此范围表示您必须提供系统路径。
import −此范围仅在依赖项为pom类型时使用。 此范围指示应使用该POM的“dependencyManagement”部分中的依赖项替换指定的POM。
{的groupId,artifactId的,类型分类}。
要引用pom.xml中定义的属性,属性名称使用定义值的XML元素的名称,允许“pom”作为项目(根)元素的别名。
所以$ {pom.name}指的是项目的名称,$ {pom.version}指的是项目的版本,$ {pom.build.finalName}指的是建立项目时创建的文件的最终名称包装等
一些有效的包装价值是jar,war,ear和pom。 如果未指定包装值,则默认为jar。
POM
元素包含执行插件所需的信息。
::
所有POM都从父级继承(尽管明确定义与否)。 此基本POM称为Super POM,包含默认继承的值。
使用POM本身中可用元素的子集指定配置文件。
,,,,, ,,
为项目提供可移植性(例如windows,linux等)。
它使用较少的存储空间,使得检查项目更快,不需要对JAR文件进行版本控制。
使用命令 -
mvn o package.
使用exclusion元素。
与范围系统的依赖关系始终可用,并且不会在存储库中查找,它们通常用于告诉Maven有关JDK或VM提供的依赖关系。 因此,系统依赖性对于解决现在由JDK提供的工件的依赖性特别有用。
可以使用“可选”元素将任何传递依赖项标记为可选。 例如,A取决于B,B取决于C.现在B将C标记为可选。 然后A不会用C.
可以使用“排除”元素排除任何传递依赖性。 例如,A取决于B,B取决于C,那么A可以将C标记为排除。
您可以将clean插件放在pom.xml文件中的执行标记内。
将设置为false。
这意味着您已使用相同的多次执行插件。 为每个提供唯一的然后就可以了。
mojo是Maven普通的旧Java对象。 每个mojo都是Maven中的可执行目标,插件是一个或多个相关mojos的分布。
Ant只是一个工具箱,而Maven则是关于模式的应用,以实现一个显示可见性,可重用性,可维护性和可理解性的基础结构。 将Maven视为构建工具并仅仅是Ant的替代品是错误的。
接下来是什么? (What is Next ?)
此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。