Maven 面试问题



尊敬的读者,这些Maven 面试问题是专门设计用来让您熟悉在Maven主题面试中可能遇到的问题性质的。根据我的经验,优秀的考官在面试期间几乎不会计划提出任何特定问题,通常问题从该主题的一些基本概念开始,然后根据进一步的讨论以及您的回答继续进行。

通常,部署过程包括以下步骤:

  • 将所有正在进行的项目的代码签入 SVN 或源代码存储库并标记它。

  • 从 SVN 下载完整的源代码。

  • 构建应用程序。

  • 将构建输出(WAR 或 EAR 文件)存储到公共网络位置。

  • 从网络获取文件并将文件部署到生产站点。

  • 使用应用程序的日期和更新版本号更新文档。

Maven 是一个项目管理和理解工具。Maven 为开发人员提供了一个完整的构建生命周期框架。开发团队几乎可以立即自动化项目的构建基础设施,因为 Maven 使用标准目录布局和默认构建生命周期。

Maven 使用约定优于配置,这意味着开发人员不需要自己创建构建过程。开发人员不必提及每一个配置细节。

Maven 为开发人员提供了管理以下方面的方法:

  • 构建
  • 文档
  • 报告

  • 依赖项

  • SCM(版本控制系统)

  • 发布

  • 分发

  • 邮件列表

输入以下命令:

mvn --version

POM 代表项目对象模型 (Project Object Model)。它是 Maven 中的基本工作单元。它是一个 XML 文件。它始终位于项目的基目录中,名为 pom.xml。它包含有关项目和 Maven 用于构建项目的信息以及各种配置详细信息。

POM 包含以下一些配置信息:

  • 项目依赖项
  • 插件
  • 目标
  • 构建配置文件
  • 项目版本
  • 开发者
  • 邮件列表

制品是一个文件,通常是一个 JAR 文件,它被部署到 Maven 仓库。Maven 构建会生成一个或多个制品,例如编译后的 JAR 和“源代码”JAR。

每个制品都有一个组 ID(通常是反向域名,例如 com.example.foo)、一个制品 ID(只是一个名称)和一个版本字符串。这三者共同唯一地标识了该制品。项目的依赖项被指定为制品。

构建生命周期是预定义的阶段序列,定义了目标执行的顺序。这里的阶段表示生命周期中的一个阶段。

三个构建生命周期是:

  • clean:清理先前构建创建的工件。

  • default(或 build):用于构建应用程序。

  • site:生成项目的站点文档。

输入命令:

mvn site

此命令在开始构建过程之前删除包含所有构建数据的 target 目录。

阶段如下:

  • validate - 验证项目是否正确以及所有必要信息是否可用。

  • compile - 编译项目的源代码。

  • test - 使用合适的单元测试框架测试编译后的源代码。这些测试不应该要求代码被打包或部署。

  • package - 获取编译后的代码并将其打包成可分发的格式,例如 JAR。

  • integration-test - 如果需要,处理并将包部署到可以运行集成测试的环境中。

  • verify - 运行任何检查以验证包是否有效并符合质量标准。

  • install - 将包安装到本地存储库中,以便在本地其他项目中用作依赖项。

  • deploy - 在集成或发布环境中完成,将最终包复制到远程存储库,以便与其他开发人员和项目共享。

目标表示有助于项目构建和管理的特定任务。它可以绑定到零个或多个构建阶段。未绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。

此命令将清理项目,复制依赖项并打包项目(执行直至package的所有阶段)。

clean 生命周期包含以下阶段:

  • pre-clean
  • clean
  • post-clean

Site 生命周期中的阶段为:

  • pre-site
  • site
  • post-site
  • site-deploy

构建配置文件是一组配置值,可用于设置或覆盖 Maven 构建的默认值。使用构建配置文件,您可以为不同的环境(例如生产环境与开发环境)定制构建。

构建配置文件有三种类型:

  • 每个项目 - 在项目 POM 文件 pom.xml 中定义。

  • 每个用户 - 在 Maven settings xml 文件(%USER_HOME%/.m2/settings.xml)中定义。

  • 全局 - 在 Maven 全局 settings xml 文件(%M2_HOME%/conf/settings.xml)中定义。

Maven 构建配置文件可以通过多种方式激活:

  • 显式使用命令控制台输入。

  • 通过 Maven 设置。

  • 基于环境变量(用户/系统变量)。

  • 操作系统设置(例如,Windows 系列)。

  • 存在/缺失文件。

仓库是一个位置,即目录,所有项目 jar、库 jar、插件或任何其他项目特定工件都存储在其中,Maven 可以轻松使用它们。

Maven 仓库有三种类型:本地、中央和远程。

Maven 本地仓库是您机器上的一个文件夹位置。首次运行任何 Maven 命令时会创建它。Maven 本地仓库保存您项目的所有依赖项(库 jar、插件 jar 等)。

~/m2/repository。

mvn install

这是 Maven 社区提供的仓库。它包含大量常用的库。当 Maven 在本地仓库中找不到任何依赖项时,它将使用以下 URL 在中央仓库中开始搜索:http://repo1.maven.org/maven2/。

有时,Maven 也无法在中央仓库中找到提到的依赖项,然后它会停止构建过程并将错误消息输出到控制台。为了防止这种情况,Maven 提供了远程仓库的概念,它是开发者自己的自定义仓库,包含所需的库或其他项目 jar。

搜索模式如下:

  • 步骤 1 - 在本地仓库中搜索依赖项,如果未找到,则转到步骤 2;否则,如果找到,则进行进一步处理。

  • 步骤 2 - 在中央仓库中搜索依赖项,如果未找到并且已提及远程仓库,则转到步骤 4;否则,如果找到,则将其下载到本地仓库以备将来参考。

  • 步骤 3 - 如果未提及远程仓库,Maven 将简单地停止处理并抛出错误(无法找到依赖项)。

  • 步骤 4 - 在远程仓库中搜索依赖项,如果找到,则将其下载到本地仓库以备将来参考;否则,Maven 将按预期停止处理并抛出错误(无法找到依赖项)。

Maven 插件用于:

  • 创建 jar 文件。
  • 创建 war 文件。
  • 编译代码文件。
  • 对代码进行单元测试。
  • 创建项目文档。
  • 创建项目报告。

Maven 提供以下两种类型的插件:

  • 构建插件 - 它们在构建期间执行,应在 pom.xml 的 <build/> 元素中配置。

  • 报告插件 - 它们在站点生成期间执行,应在 pom.xml 的 <reporting/> 元素中配置。

Maven 使用 Maven 仓库(本地、中央、远程)的概念进行依赖管理。假设在任何远程仓库和中央仓库中都找不到依赖项;在这种情况下,Maven 使用外部依赖的概念。

外部依赖(库jar文件位置)可以在pom.xml文件中与其他依赖项一样进行配置。

  • groupId指定为库的名称。
  • artifactId指定为库的名称。
  • scope指定为system。
  • 指定相对于项目位置的系统路径。

Archetype是一个Maven插件,其任务是根据其模板创建项目结构。

输入以下命令:

mvn archetype:generate

SNAPSHOT是一个特殊版本,表示当前开发版本。与常规版本不同,Maven在每次构建时都会检查远程存储库中是否存在新的SNAPSHOT版本。

对于Version,如果Maven曾经下载了指定的版本,例如data-service:1.0,它将永远不会尝试下载存储库中可用的较新的1.0版本。要下载更新的代码,需要将data-service版本升级到1.1。

对于SNAPSHOT,Maven每次app-ui团队构建其项目时都会自动获取最新的SNAPSHOT(data-service:1.0-SNAPSHOT)。

传递依赖意味着无需发现和指定自身依赖项所需的库,并自动包含它们。

这意味着在遇到传递依赖项中的构件时,直接指定要使用的构件版本。例如,项目C可以在其dependencyManagement部分中包含B作为依赖项,并直接控制在引用B时要使用的版本。

当遇到多个版本的构件时,Maven会确定要使用哪个版本的依赖项。如果两个依赖项版本在依赖树中位于相同的深度,则将使用第一个声明的依赖项。这称为依赖仲裁(dependency mediation)。

依赖范围包括根据构建的当前阶段包含的依赖项。各种依赖范围如下:

  • compile − 此范围表示依赖项在项目的类路径中可用。这是默认范围。

  • provided − 此范围表示依赖项应由JDK或Web服务器/容器在运行时提供。

  • runtime − 此范围表示依赖项不需要编译,但在执行期间需要。

  • test − 此范围表示依赖项仅在测试编译和执行阶段可用。

  • system − 此范围表示您必须提供系统路径。

  • import − 此范围仅在依赖项类型为pom时使用。此范围表示指定的POM应替换为该POM的<dependencyManagement>部分中的依赖项。

{groupId,artifactId,type,classifier}。

要引用pom.xml文件中定义的属性,属性名称使用定义值的XML元素的名称,其中“pom”允许作为项目(根)元素的别名。

因此,${pom.name} 指的是项目名称,${pom.version} 指的是项目版本,${pom.build.finalName} 指的是打包构建项目时创建的文件的最终名称,等等。

一些有效的packaging值是jar、war、ear和pom。如果没有指定packaging值,则默认为jar。

pom

<execution>元素包含执行插件所需的信息。

<groupId>:<artifactId>:<version>

所有POM都从父POM继承(无论是否显式定义)。此基本POM称为Super POM,包含默认继承的值。

使用POM本身中可用元素的子集来指定配置文件。

<repositories>,<pluginRepositories>,<dependencies>,<plugins>,<properties>,<modules>,<reporting>,<dependencyManagement>,<distributionManagement>

为了使项目具有可移植性(例如,Windows、Linux等)。

它使用更少的存储空间,使签出项目更快,无需对JAR文件进行版本控制。

使用以下命令:

mvn o package.

使用exclusion元素。

范围为system的依赖项始终可用,并且不会在存储库中查找,它们通常用于告诉Maven有关JDK或VM提供的依赖项的信息。因此,系统依赖项对于解析现在由JDK提供的构件的依赖项特别有用。

任何传递依赖项都可以使用“optional”元素标记为可选。例如,A依赖于B,B依赖于C。现在B将C标记为可选。那么A将不会使用C。

任何传递依赖项都可以使用“exclusion”元素排除。例如,A依赖于B,B依赖于C,那么A可以将C标记为排除。

您可以将clean插件放在pom.xml文件中的execution标签内。

将<inherited>设置为false。

这意味着您使用相同的<id>多次执行了插件。为每个<execution>提供唯一的<id>,这样就可以了。

Mojo是Maven普通的旧Java对象。每个mojo都是Maven中的一个可执行目标,插件是一个或多个相关mojo的分布。

Ant只是一个工具箱,而Maven是关于应用模式以实现一个基础架构,该基础架构显示出可见性、可重用性、可维护性和可理解性的特性。将Maven视为构建工具以及Ant的替代品是错误的。

下一步是什么?

接下来,您可以回顾一下您过去在这个主题上完成的任务,并确保您可以自信地谈论它们。如果您是应届毕业生,面试官不会期望您回答非常复杂的问题,而是要让您的基础概念非常扎实。

其次,如果您无法回答一些问题,这并不重要,重要的是,无论您回答了什么,都必须自信地回答。所以在面试中要自信。Tutorialspoint祝您面试顺利,并祝您未来的事业一切顺利。干杯 :-)

maven_questions_answers.htm
广告