Maven 面试问题

亲爱的读者,这些 Maven 面试问题 是专门为让您了解您在面试时可能遇到的关于 Maven 主题的问题的性质而设计的。 根据我的经验,优秀的面试官几乎不打算在你的面试中问任何特定的问题,通常问题从主题的一些基本概念开始,然后根据进一步的讨论和你的回答继续:

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

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

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

  • 构建应用程序。

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

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

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

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

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

Maven 为开发人员提供了管理以下内容的方法 −

  • Builds
  • Documentation
  • Reporting

  • Dependencies

  • SCMs

  • Releases

  • Distribution

  • mailing list

键入以下命令 −

mvn --version

POM 代表项目对象模型。 它是 Maven 中的基本工作单元。 它是一个 XML 文件。 它始终作为 pom.xml 驻留在项目的基本目录中。 它包含有关项目的信息以及 Maven 用于构建项目的各种配置细节。

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

  • project dependencies
  • plugins
  • goals
  • build profiles
  • project version
  • developers
  • mailing list

工件是一个文件,通常是部署到 Maven 存储库的 JAR。 Maven 构建会生成一个或多个工件,例如已编译的 JAR 和"源"JAR。

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

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

三个构建生命周期是 −

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

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

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

输入命令 −

mvn site

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

以下是阶段 −

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

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

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

  • package − take the compiled code and package it in its distributable format, such as a JAR.

  • integration-test − 处理并在必要时将包部署到可以运行集成测试的环境中。

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

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

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

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

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

Clean 生命周期由以下阶段组成 −

  • pre-clean
  • clean
  • post-clean

网站生命周期的阶段是 −

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

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

构建配置文件分为三种类型 −

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

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

  • 全局 − 定义在 Maven 全局设置 xml 文件 (%M2_HOME%/conf/settings.xml)

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

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

  • 通过 maven 设置。

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

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

  • 存在/丢失文件。

存储库是一个地方,即存储所有项目 jar、库 jar、插件或任何其他项目特定工件的目录,并且可以被 Maven 轻松使用。

Maven 存储库分为三种类型: local, central, remote

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

~/m2./repository.

mvn install

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

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

以下是搜索模式 −

  • 步骤 1 − 在本地存储库中搜索依赖项,如果没有找到,则转到步骤 2,否则如果找到则进行进一步处理。

  • 步骤 2 − 在中央存储库中搜索依赖关系,如果未找到并且提到远程存储库/存储库,则移动到步骤 4,否则如果找到,则将其下载到本地存储库以供将来参考。

  • 步骤 3 − 如果没有提到远程存储库,Maven 会简单地停止处理并抛出错误(无法找到依赖项)。

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

Maven 插件用于 −

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

Maven 提供以下两种类型的 Plugins −

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

  • 报告插件 − 它们在网站生成期间执行,应在 <reporting/> pom.xml 的元素

使用 Maven 存储库(本地、中央、远程)概念的 Maven 依赖管理。 假设在任何远程存储库和中央存储库中都没有依赖关系; 在这种情况下,Maven 使用外部依赖的概念。

可以在 pom.xml 中以与其他依赖项相同的方式配置外部依赖项(库 jar 位置)。

  • 指定与库名称相同的 groupId。
  • 指定与库名称相同的 artifactId。
  • 将范围指定为系统。
  • 指定相对于项目位置的系统路径。

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

键入以下命令 −

mvn archetype:generate

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

在版本的情况下,如果 Maven 曾经下载过提到的版本说 data-service:1.0,它永远不会尝试下载存储库中可用的更新的 1.0。 要下载更新的代码,数据服务版本升级到1.1。

在 SNAPSHOT 的情况下,每次 app-ui 团队构建他们的项目时,Maven 都会自动获取最新的 SNAPSHOT (data-service:1.0-SNAPSHOT)。

传递依赖意味着避免需要发现和指定你自己的依赖所需要的库,并自动包含它们。

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

当遇到工件的多个版本时,Maven 会确定要使用哪个版本的依赖项。 如果两个依赖版本在依赖树中的深度相同,则将使用第一个声明的依赖。 这称为依赖调解。

依赖范围包括根据当前构建阶段的依赖关系。 各种依赖范围是 −

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

  • provided − 这个范围表示依赖关系将由 JDK 或 web-Server/Container 在运行时提供。

  • runtime − 这个范围表示编译不需要依赖,但在执行过程中需要。

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

  • system −这个范围表示你必须提供系统路径。

  • import − 这个作用域只在依赖是 pom 类型时使用。 此范围指示应将指定的 POM 替换为该 POM 的 <dependencyManagement> 部分中的依赖项。

{groupId,artifactId,type,classifier}.

要引用在 pom.xml 中定义的属性,属性名称使用定义值的 XML 元素的名称,"pom"被允许作为项目(根)元素的别名。

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

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

pom

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

<groupId>:<artifactId>:<version>

所有 POM 都从父级继承(无论是否明确定义)。 这个基本 POM 被称为超级 POM,它包含默认继承的值。

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

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

为项目(例如 windows、linux 等)提供可移植性。

它使用更少的存储空间,它可以更快地签出项目,不需要版本控制 JAR 文件。

使用命令 −

mvn o package.

使用 exclusion 元素。

范围系统的依赖关系总是可用的,并且不会在存储库中查找,它们通常用于告诉 Maven JDK 或 VM 提供的依赖关系。 因此,系统依赖关系对于解决对现在由 JDK 提供的工件的依赖关系特别有用。

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

可以使用"排除"元素排除任何传递依赖。 例如,A 依赖于 B,B 依赖于 C,则 A 可以将 C 标记为已排除。

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

set <inherited> to false.

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

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

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


下一步是什么?

此外,您还可以回顾您过去完成的有关该主题的作业,并确保您能够自信地谈论它们。 如果你比较新鲜,那么面试官不会期望你会回答非常复杂的问题,而是必须让你的基本概念非常强大。

其次,如果您不能回答几个问题,这实际上并不重要,但重要的是,无论您回答什么,您都必须充满信心地回答。 所以,在你的面试中保持自信。 我们祝你好运,有一个好的面试官,祝你未来的工作一切顺利。 干杯:-)