Maven從入門到精通,小白也能快速上手
我是陳皮,一個在互聯網 Coding 的 ITer,微信搜索「陳皮的JavaLib」第一時間閱讀最新文章,回復【資料】,即可獲得我精心整理的技術資料,電子書籍,一線大廠面試資料和優秀簡歷模板。

1 Maven 簡介
Maven 是 Apache 組織下的一個純 Java 開發的開源項目。基于項目對象模型(POM)概念,Maven 是一個項目管理工具,提供對 Java 項目進行構建、打包、部署、依賴管理以及項目信息管理等功能。當然,Maven 也可用于構建和管理其他語言項目,例如 C#,Ruby,Scala 等。
我們平時開發一個項目,做的事情就是搭建項目框架,寫代碼,單元測試,編譯構建,生成文檔,打包部署等等工作。其實程序員更應該將精力用在寫代碼上,而其他比較固定的繁瑣步驟不應該我們每次去處理。使用 Maven 就可以將這些步驟進行自動化管理,節省了開發時間,提高開發效率。
Maven 有一個生命周期,當我們運行一些 Maven 命令的時候,Maven 會執行一系列的有序的步驟,例如清除,編譯,測試,打包等等,直到到達指定的生命周期。
Maven 官網地址:http://maven.apache.org/
2 構建工具
Maven 不是唯一的項目構建,管理工具,下面介紹主要的三個構建工具,推薦使用 Maven 和 Gradle。
Ant:比較早的 Java 構建工具,對工程構建過程控制比較靈活,但是使用的 xml 腳本格式文件比較大,逐漸很少人使用了。
Maven:改善了 Ant 的缺點,可以從網上下載依賴,也是使用 xml 格式配置文件,更加專注依賴管理,目前大多數公司使用。
Gradle:結合 Ant 的靈活和 Maven 生命周期管理的優點,不再使用 xml 格式配置文件,而是使用 DSL 腳本格式,使用 groovy 語言編寫,更加靈活,是比較新型的構建工具,目前在一些初創互聯網公司使用比較多,以后可能會成為主流。
3 Maven 安裝與配置
因為 Maven 是用 Java 開發的,所以首先要安裝 JDK,推薦使用 JDK1.8 以上版本。以下是我使用的 JDK 版本。
C:\Users\Administrator>java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
下載 Maven 安裝包,可以在官網下載,目前最高版本是 3.8.1:http://maven.apache.org/download.cgi
其他歷史版本-:https://archive.apache.org/dist/maven/maven-3/,目前我使用的是 3.6.3 版本。
下載完后解壓到你想解壓的目錄(最好不要使用中文和空格的目錄)
然后在系統環境變量中配置 MAVEN_HOME,值是你解壓到的 Maven 目錄;再將 bin 目錄配置到 path 環境變量中。
MAVEN_HOME:D:\devTools\apache-maven-3.6.3(解壓所在目錄) PATH:%MAVEN_HOME%\bin
驗證是否安裝成功,打開cmd窗口,輸入 mvn -v,出現如下信息則安裝成功。
C:\Users\Administrator>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\devTools\apache-maven-3.6.3\bin\.. Java version: 1.8.0_144, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_144\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
修改 Maven 配置(可選),主要是修改資源-,因為默認-是 Google,下載速度會很慢,可以修改國內的例如阿里云的。其次是修改下載資源的存放位置,如果不修改,默認是 c 盤用戶目錄下的 .m2 路徑中。
Maven 配置文件在解壓后的 conf 目錄下,settings.xml 文件。修改資源-為阿里云,以及修改資源庫存放位置。
4 IDEA,Eclipse 配置 Maven
4.1 IDEA 配置 Maven
IDEA 配置 Maven,有兩種方式,一種是針對本項目,只對此項目有效;一種是全局配置,針對所有新項目生效,一般我們會配置全局性的。
針對單項目配置
路徑:File | Settings | Build, Execution, Deployment | Build Tools | Maven。
全局配置
路徑:File | Other Settings | Settings for New Projects | Build, Execution, Deployment | Build Tools | Maven。
4.2 Eclipse 配置 Maven
路徑:Window | Preferences | Maven | User Settings
5 依賴管理
Maven 其中一個核心特性就是依賴管理。我們開發的項目基本會使用外部依賴,或者我們需要處理多模塊項目的模塊之間的依賴,這些依賴關系非常復雜,管理起來比較困難。使用 Maven 管理依賴能大大降低難度。
Maven 對于依賴管理一個特點是可傳遞性依賴發現,比如我們項目依賴于 A,A 又依賴于 B,如果我們手動添加的話,需要將 A 和 B 兩個依賴都下載引入項目。而使用 Maven 來構建項目的話,我們只需要顯示引入依賴 A,Maven 會通過讀取項目文件(pom.xml),找出它們項目之間的依賴關系,將 A 和 B 都引入進來。
Maven 使用坐標管理依賴,坐標包含三個標識信息,通過坐標可以唯一標識一個依賴。任何基于 Maven 構建的項目都必須定義這三個信息,包括我們自己開發的項目??梢栽?https://mvnrepository.com/ 查找依賴。
group:定義當前項目所屬組織或公司的唯一標識,一般為組織或者公司名稱域名倒寫(也可以是域名倒寫+項目名),例如 com.alibaba
artifactId:項目的唯一 ID,一般是實際項目名稱或者實際項目的一個模塊名稱(如果項目比較大,會劃分多模塊,例如 spring-core,spring-bean),例如 fastjson
version:項目的版本號,例如 1.2.76
Maven 對于依賴管理有以下基本原則:
依賴管理:可傳遞性依賴發現,Maven 會通過讀取項目文件(pom.xml),找出項目之間的依賴關系,然后將需要的所有依賴引入進來。
依賴調節:當一個依賴的不同版本在依賴樹里的深度是一樣時,第一個被聲明的依賴將會被使用。
依賴范圍:可以指定依賴的使用范圍,即項目在構建過程每個階段所包含的依賴。
依賴排除:任何可傳遞的依賴都可以通過 “exclusion” 元素被排除在外。例如,A 依賴 B, B 依賴 C,A 可以標記 C 為 “被排除的”。
依賴可選:任何可傳遞的依賴可以通過 “optional” 元素 標記為可選的。例如,A 依賴 B, B 依賴 C。B 可以標記 C 為可選的, 這樣 A 就可以不再使用 C。
依賴的范圍可選項如下:
compile:編譯范圍,也是默認的依賴范圍。使用此范圍的依賴,在編譯,測試,運行時三種 classpath 都有效。
provided:已提供范圍。使用此范圍的依賴,在編譯,測試 classpath 中有效,在運行時 classpath 無效。例如 servlet-api 依賴,編譯和測試需要此依賴,但是在運行時不需要,因為容器已經提供了。
test:測試范圍。該范圍表明相關依賴只在測試編譯階段和執行階段。
runtime:運行時范圍。在測試和運行時有效,編譯期無效。例如 JDBC 驅動實現,在項目編譯時只需要 JDK 提供的 JDBC 接口,只有在測試和運行時才真正需要 JDBC 接口的實現類,即 具體的 JDBC 驅動。
system:系統范圍。此依賴范圍和 provided 一樣,但是它必須顯示通過 systemPath 指定依賴文件的路徑。這種依賴不是由 Maven 中央倉庫解析的,一般是本地的某個路徑下的依賴。
optional:表明依賴是可選的。
exclusions:用來排除傳遞性依賴。
這里講下依賴范圍為 system 的情況,項目如何引入外部依賴。首先將下載好的外部依賴,放入到項目已經創建好的文件夾里(例如 libs)。
在項目的 pom.xml 文件中添加依賴
6 Maven 倉庫
基于 Maven 構建的項目,項目需要的依賴首先會在本地倉庫中查找,如果沒有找到則會從遠程倉庫下載到本地倉庫。如果這兩者都沒有找到,Maven 就會報錯。
遠程倉庫可以分為中央倉庫,其他公共庫以及私服。
中央倉庫是 Maven 默認的遠程倉庫。地址:https://repo.maven.apache.org
其他公共庫一般是中央倉庫的鏡像加速庫,因為中央倉庫在國外,在國內下載會比較慢,所以有些組織或者公司會創建其他公共庫供大家使用,例如阿里云倉庫。
私服一般是在局域網內設立的一個私有的倉庫服務,供內部開發人員使用。它代理了外部遠程倉庫,內部用戶下載依賴的時候會先到私服上查找,如果沒有才從外部遠程倉庫下載,并緩存在私服。能節省帶寬和加快下載速度,并且公司內部的依賴也能放在私服上供公司其他人下載使用。
每個用戶在自己電腦上會有個本地倉庫,存放所有下載過的依賴包,Windows 環境下,位置一般在用戶目錄的 .m2/repository 目錄下。
7 Maven 項目結構
基于約定大于配置的原則,Maven 制定了一套標準的項目目錄結構,規定了哪些文件需要放在哪些目錄下,解決了在不同 IDE 開發工具中帶來的項目目錄結構不一致的問題。
${basedir}:根目錄,pom.xml 文件以及項目所有的子目錄
${basedir}/src/main/java:項目的 java 源代碼
${basedir}/src/main/resources:項目的資源文件,例如 application.yml,xml 文件等
${basedir}/src/test/java:存放項目的 java 測試源代碼
${basedir}/src/test/resources:存放項目測試要用的資源文件
${basedir}/target:編譯打包輸出目錄
${basedir}/target/classes:編譯輸出目錄
${basedir}/target/test-classes:測試編譯輸出目錄
8 插件機制
Maven 可以添加插件,插件其實就是一些 jar 文件,執行 Maven 命令時,真正完成功能的就是插件。例如項目使用 Tomcat 服務器,我們可以引入一些 Tomcat 相關的插件。使用 Springboot 框架,可以用引入 spring-boot 相關的 maven 插件。
比較常用的插件是 Maven 編譯插件,可以設置項目使用的 JDK 版本時通過編譯插件指定。
9 Maven 命令
Maven 提供了許多命令,來幫助構建,管理項目。不過現在許多 IDE 開發工具提供了將這些命令圖形化的功能,只要點擊相應的按鈕也可執行相應的命令。
Maven 的命令格式:mvn [plugin-name]:[goal-name],即執行 plugin-name 插件的 goal-name 目標。
mvn -version:顯示 Maven 版本信息
mvn clean:清理項目編譯產生的臨時文件,一般是模塊下的 target 目錄
mvn compile:編譯源代碼
mvn package:打包項目,一般會在模塊下的 target 目錄下生成 jar 或者 war 文件
mvn test:執行測試用例
mvn install:打包項目的 jar 或者 war 到本地倉庫,供其他模塊使用
mvn deploy:打包項目的 jar 或者 war 到遠程倉庫,供其他人員下載使用
mvn site:生成項目相關信息的網站
mvn eclipse:eclipse:將項目轉化為 eclipse 項目
mvn dependency:tree:打印項目的整個依賴樹
mvn archetype:generate:創建普通 maven 項目
mvn tomcat7:run:在 tomcat 容器中運行 web 項目
mvn jetty:run:在 jetty 容器中運行 web 項目
Maven 命令可以帶參數,例如 mvn package -Dmaven.test.skip=true 會在打包的時候跳過單元測試。
Maven 有以下三個標準的生命周期
clean:清理項目產生的臨時文件
default(也叫 build):關于項目構建,打包,部署等的處理
site:項目站點文檔創建的處理
執行某個 maven 命令時,會先執行這個命令前的所有命令,例如執行 mvn package 生成可執行 jar,會依次執行 pre-clean,clean,…,test,package等命令。
10 使用 IDEA 創建簡單 Maven 項目
首先通過 IDEA 工具創建一個 Maven 項目,選擇 JDK,選擇 Maven 模板。
按上述步驟一般沒有 resources 目錄,所以我們手動創建源文件資源目錄和測試資源目錄。
最終項目的目錄結構如下:
項目根目錄下有個 pom.xml 文件,一些常用標簽介紹如下:
modelVersion:指定當前 pom 模型的版本,對于 maven2 和 maven3 來說,只能填寫 4.0.0
groupId:定義項目的所屬組或者公司,一般是公司域名的倒寫
artifactId:項目在所屬組的唯一ID
version:項目版本號
name:項目名稱,可選
description:對項目的描述,可選
properties:定義一些屬性變量
dependencies:定義項目使用到的依賴
packaging:項目打包的類型,默認是 jar,可選值有 jar,war,rar,ear,ejb,pom等等
build:與構建相關的配置,例如設置編譯插件的 JDK 版本
在剪輯器的右邊,有個 Maven 菜單欄,這里有 Maven 相關命令可以直接雙擊執行,還有插件列表,項目依賴列表。
11 使用 Maven 構建多模塊項目
如果一個項目比較大時,會拆分成多個模塊進行開發,例如一個項目的 dao,service,controller 層被拆分到不同模塊中;Spring 框架中的 spring-core,spring-bean,spring-webmvc 等模塊。
基于Maven 構建的項目,一般會定義一個 parent POM 作為一組子 module 的聚合 POM。在 parent POM 中使用
首先創建父模塊,創建一個不使用模板的 maven 項目。
然后在父模塊的基礎上創建子模塊,直接在父模塊項目右鍵創建子模塊 maven-dao,maven-service,maven-controller。
最終的項目目錄結構如下所示:
子模塊間依賴處理,因為 maven-controller 模塊依賴 maven-service 模塊,maven-service 模塊依賴 maven-dao 模塊。
我們需要在 maven-controller 模塊的 pom.xml 文件中依賴 maven-service 模塊;
我們需要在 maven-service 模塊的 pom.xml 文件中依賴 maven-dao 模塊;
Maven XML
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。