什麼是Maven? 使用Apache Maven構建和依賴項管理
開始使用最流行的Java構建和依賴管理工具Maven
Apache Maven是Java開發的基石,也是Java使用最廣泛的構建管理工具。 Maven簡化的基於XML的配置模型使開發人員能夠快速描述或掌握任何基於Java的項目的輪廓,這使得啓動和共享新項目變得很容易。
Maven還支持測試驅動的開發,長期項目維護,其聲明性配置和廣泛的插件使其成爲CI / CD的流行選擇。 本文是對Apache Maven的快速介紹,包括Maven POM和目錄結構,以及用於構建第一個Maven項目的命令。
請注意,撰寫本文時最新的Maven版本是Maven 3.6.3。
Maven vs Ant and Gradle
儘管Maven是最受歡迎的工具,但它並不是Java生態系統中唯一的構建工具。 Ant是較早的基於XML的配置工具,它缺乏Maven的標準化,基於約定的實踐和依賴管理,但是確實提供了Maven所沒有的靈活性。
Gradle是一種較新的工具,可在Maven生態系統之上運行(使用Maven的存儲庫),但支持使用基於Groovy或Kotlin的DSL進行配置。 這三個都是獨立的好構建工具,每個都可以集成到CI / CD流程中。 重要的是爲你的需求選擇合適的,並知道如何正確使用它。
Maven是如何工作的
像許多出色的工具一樣,Maven可以將曾經過於複雜的內容(配置地獄)簡化爲易於消化的部分。 Maven包含三個組件:
POM:描述Maven項目及其依賴項的文件。
目錄:用於描述POM中的Maven項目的標準化格式。
存儲庫:存儲和發現第三方軟件的位置。
Maven POM:每個使用Maven的Java項目在其根目錄中都有一個POM(項目對象模型)文件。 pom.xml描述了項目的依賴關係,並告訴你如何構建它。 (依賴關係是項目所需的第三方軟件。一些常見的示例是JUnit和JDBC。有關所有可用工具和流行依賴關係的列表,請參見Maven中央存儲庫。)
Maven目錄:Maven目錄實現了所謂的基於配置的約定,這是對配置地獄的優雅解決方案。 Maven不需要開發人員爲每個新項目定義佈局和手動配置組件(makefile和Ant就是這種情況),而是建立了通用的項目結構並提供了描述其工作方式的標準文件格式。你只需插入需求,Maven就會調用依賴項併爲你配置項目。
集中式存儲庫:最後,Maven使用集中式存儲庫來發現和發佈作爲依賴項的項目包。當你在項目中引用依賴項時,Maven會在集中式存儲庫中發現它,將其下載到本地存儲庫,然後將其安裝到你的項目中。在大多數情況下,作爲開發人員,所有這些都不可見。
訪問Maven依賴項
默認情況下,Maven從Maven中央存儲庫解析依賴關係。一個常見的替代方案是JCenter,它具有更多可用軟件包集。組織還發布和託管內部存儲庫,這些存儲庫可以是公共的或私有的。爲了訪問存儲庫,你可以在Maven POM中指定其URL,也可以指示Maven在其他存儲庫中查找。
安裝Maven
Maven是一個Java項目,因此在安裝它之前,需要在開發環境中安裝JDK。 (有關下載和安裝JDK的更多信息,請參見“什麼是JDK?Java開發工具包簡介”。)
設置Java開發環境後,只需幾個步驟即可安裝Maven:
1.下載最新的Maven版本(截至撰寫本文時,Maven 3.6.3)。
2.將apache.maven.zip文件解壓縮到方便的位置。
3.將該文件放在路徑上。 例如,在Unix或Linux系統上:export PATH = $ PATH:/ home / maven /。
你現在應該可以訪問mvn命令了。 鍵入mvn -v以確保已成功安裝Maven。
Maven POM
每個Maven項目的根目錄都是pom.xml文件。 儘管XML以其乏味而著稱,但在此用例中,XML實際上效果很好。 Maven的POM易於閱讀,並揭示了項目中正在發生的許多事情。 (如果你使用過JavaScript,則pom.xml的用途類似於Node NPM的package.json文件。)
清單1顯示了一個非常簡單的Maven pom.xml。
清單1.簡單的Maven POM
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javaworld</groupId>
<artifactId>what-is-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Simple Maven Project</name>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies></project>
瞭解Maven POM
一旦掌握了它,POM就不會神祕了。 首先,你可以瀏覽XML序言,該序言僅引用正式的POM模式。 但是請注意XML以modelVersion開頭。 這告訴Maven使用什麼版本的POM,在本例中爲Maven POM 4.0.0。
接下來,你有groupId,artifactId和version。 這三個屬性一起唯一地標識了存儲庫中每個Maven管理的資源。 文件頂部的這些屬性描述了你的Maven項目。
現在,看看POM的依賴項部分,我們在其中描述項目的依賴項。 在這種情況下,到目前爲止,我們僅引入了一種依賴關係,即JUnit。 請注意,JUnit也根據其groupId,artifactId和版本進行描述。
無論你是描述自己的項目還是項目依賴項,這些值始終告訴Maven在Maven存儲庫中找到項目的位置以及可以使用的版本。
將項目託管在Maven存儲庫中
請記住,POM定義了項目需要運行的所有內容,但同時也將項目描述爲潛在的依賴項。 如果你要構建一個將成爲依賴項的項目(例如,創建供其他項目使用的庫),則需要通過以下四種方式之一使它可用:
1.使其在本地可用。
2.發佈到私有管理的遠程存儲庫。
3.發佈到基於雲的私有存儲庫。
4.發佈到公共存儲庫(如Maven Central)。
在第一種情況下,根本不使用遠程存儲庫。 相反,其他開發人員將使用mvn install命令將你的項目本地下載並安裝到其Maven存儲庫中。
在第二種情況下,你使用託管的Maven存儲庫,使用私有控制的服務器發佈和下載依賴項。 爲此,你需要一個倉庫管理器,例如Apache Archiva。
較新的替代方法是使用私有遠程存儲庫,但依靠基於雲的服務來管理它,例如Cloudsmith。 這帶來了遠程託管的依賴項的好處,而無需建立回購服務器。 當然,這項服務是收費的。
最後,一小部分項目將最終存儲在Central Maven存儲庫或JCenter中,這些存儲庫旨在用於廣泛使用的公共軟件包。 如果要創建供其他人使用的開源依賴項,則需要這些集中存儲庫之一才能使你的工作對全世界可用。
瞭解有關在Maven存儲庫中託管項目的更多信息,並獲取可用存儲庫的列表。
請參閱有關Maven發行插件的官方Maven文檔,該文檔用於準備和管理髮布到Maven存儲庫的軟件。
編譯Maven包
如果你從清單1創建pom.xml並將其放在目錄中,則可以對其執行Maven命令。 Maven有許多命令,並且可以通過插件使用更多命令,但是你只需要知道一些即可啓動。
對於第一個命令,請嘗試執行mvn軟件包。 即使你還沒有任何源代碼,執行此命令也會告訴Maven下載JUnit依賴項。 你可以檢查Maven的日誌記錄輸出以查看依賴項是否已加載。
依賴範圍
你可能已經注意到示例POM中的JUnit依賴項被標記爲作用域測試。 範圍是依賴管理中的一個重要概念,從本質上講,你可以定義和限制在項目中如何調用和使用每個依賴。 測試範圍確保運行測試時依賴項可用,但打包應用程序進行部署時不提供依賴項。
提供了另一個常見的作用域,它告訴框架依賴項是由運行時環境提供的。 部署到Servlet容器時,通常會在Servlet JARS中看到這種情況,因爲該容器將提供那些JARS。 請參閱Apache Maven文檔以獲取Maven依賴範圍的完整列表。
Maven的目錄結構
完成命令後,請注意Maven已創建一個/ target目錄。 這是項目輸出的標準位置。 你下載的依賴項將與已編譯的應用程序工件一起位於/ target目錄中。
接下來,你要添加一個Java文件,該文件將放置在Maven src /目錄中。 使用清單2的內容創建一個/src/main/java/com/javaworld/Hello.java文件。
清單2. Hello.java
com.javaworld
public class Hello {
public static void main(String[] args){
System.out.println("Hello, JavaWorld");
}}
/ src路徑是項目源文件的標準位置。 大多數項目將其主文件放在/ src / main /中,而Java文件則放在/ java下的類路徑中。 此外,如果要包括非代碼資產,例如配置文件或映像,則可以使用/ src / main / resources。 此路徑中的資產將添加到主類路徑。 測試文件進入/ src / test / java。
作爲回顧,以下是Maven項目結構的一些關鍵部分(由Maven標準目錄結構定義):
Key parts of the Maven Standard Directory Structure
pom.xml The project descriptor file
/src/main/java Location of source files
/src/main/resources Location of non-source assets
/src/test/java Location of test source files
/target Location of the build output
管理你的Maven項目
mvn軟件包命令指示Maven捆綁項目。 準備好將所有項目文件收集到一個位置時,發出此命令。 回想一下在該項目的POM文件中,我們將打包類型設置爲jar,因此此命令告訴Maven將應用程序文件打包爲JAR。
Maven提供了多種其他選項來控制JAR的管理方式(無論是胖JAR還是瘦JAR),並指定可執行的主類。 請參閱Maven文檔以瞭解有關Maven中文件管理的更多信息。
捆綁項目後,你可能需要發佈mvn安裝。 此命令將項目推送到本地Maven存儲庫中。 將其放入本地存儲庫後,即可用於本地系統中的其他Maven項目。 這對於你和/或你的團隊正在創建尚未發佈到中央存儲庫的依賴項JAR的開發場景很有用。
其他Maven命令
準備好運行在/ src / java / test目錄中定義的單元測試時,請輸入mvn test。
準備編譯項目的類文件時,輸入mvn compile。 如果你正在運行熱部署設置,則此命令將觸發熱部署類加載器。 (諸如Spring Boot的mvn spring-boot:runcommand之類的熱部署工具將監視類文件中的更改,並且編譯將導致你的源文件被編譯,正在運行的應用程序將反映這些更改。)
開始一個新項目:Maven和Spring中的原型
Maven原型是用於基於各種預定義設置啓動新項目的模板。每個原型都提供了預先打包的依賴關係,例如Java EE或Java Web應用程序項目。你還可以從現有項目中創建新的原型,然後使用它來基於這些預定義的佈局快速創建新項目。請參閱Maven文檔以瞭解有關Apache Maven原型的更多信息。
與Maven配合良好的Spring框架提供了附加的,複雜的功能,可用於暫存新項目。例如,Spring Initializr是一個工具,可讓你非常快速地在新應用中定義所需的元素。 Initializr本質上不是Maven原型,但其目的相同,即基於前期規範生成項目佈局。在Initializr中,你可以鍵入mvn archetype:generate並瀏覽選項以找到適合你所構建內容的原型。
添加依賴
上一個1 2
在開發或維護軟件時,你將需要不時向現有項目中添加新功能。 幸運的是,Maven使添加新功能非常容易。 假設你正在處理清單1中定義的項目,並意識到需要使用Apache Commons Languagelibrary中的一些實用程序。 你可以在JUNit之後輕鬆地將該依賴項插入到原始POM文件中,如清單3所示。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version></dependency>
查找依賴關係也很容易。 爲此,你只需在網絡瀏覽器中鍵入“ maven stringutils”,它就會顯示出來。 或者你可以直接搜索Central Maven存儲庫。 當你在項目主頁或其他資源上閱讀依賴時,你可能還會找到所需依賴的鏈接。 只需剪切並粘貼URL,並確保記下正確的版本號,就可以了。
結論
Maven之所以如此常用是因爲它運行良好並且足夠成熟,可以處理你向它扔的任何東西。 瞭解Maven並將其用作項目的基礎可釋放Java生態系統中爲你提供的大量功能。 要想盡一切可能,請考慮簽出這些項目中的任何一個,這些項目都可以通過Maven核心插件進行訪問。
Maven核心插件
maven-sure fire-插件 在專用類加載器中運行單元測試。
春季啓動maven插件 允許通過彈簧啓動運行彈簧應用程序:運行。
maven-部署-插件 用於將包發佈到遠程存儲庫中。
maven-彙編-插件 允許構建fat或uber JARs,也就是說,JAR文件包含一個文件中的所有相關性和資產,能夠按原樣運行。
maven-shade-插件 允許構建一個胖JAR,允許刪除未使用的文件,或者重命名衝突的文件。
喜歡這篇文章的可以點個贊,歡迎大家留言評論,記得關注我,每天持續更新技術乾貨、職場趣事、海量面試資料等等
如果你對java技術很感興趣也可以交流學習,共同學習進步。
不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代
文章寫道這裏,歡迎完善交流。最後奉上近期整理出來的一套完整的java架構思維導圖,分享給大家對照知識點參考學習。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java乾貨