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
廣告