Maven環境

第1章 Maven 介紹

什么是 Maven

什么是 Maven

Maven 的正確發音是[?mev?n],而不是“馬瘟”以及其他什么瘟。Maven 在美國是一個口語化的詞
語,代表專家、內行的意思。
一個對 Maven 比較正式的定義是這么說的:Maven 是一個項目管理工具,它包含了一個項目對象模
型 (POM:Project Object Model),一組標準集合,一個項目生命周期(Project Lifecycle),一個依賴管
理系統(Dependency Management System),和用來運行定義在生命周期階段(phase)中插件(plugin)目標
(goal)的邏輯。

Maven 能解決什么問題

可以用更通俗的方式來說明。我們知道,項目開發不僅僅是寫寫代碼而已,期間會伴隨著各種必不可少的事情要做,下面列舉幾個感受一下:


  • 我們需要引用各種 jar 包,尤其是比較大的工程,引用的 jar 包往往有幾十個乃至上百個, 每用
    到一種 jar 包,都需要手動引入工程目錄,而且經常遇到各種讓人抓狂的 jar 包沖突,版本沖突。
  • 我們辛辛苦苦寫好了 Java 文件,可是只懂 0 和 1 的白癡電腦卻完全讀不懂,需要將它編譯成二
    進制字節碼。好歹現在這項工作可以由各種集成開發工具幫我們完成,Eclipse、IDEA 等都可以將代
    碼即時編譯。當然,如果你嫌生命漫長,何不鋪張,也可以用記事本來敲代碼,然后用 javac 命令一
    個個地去編譯,逗電腦玩。
  • 世界上沒有不存在 bug 的代碼,計算機喜歡 bug 就和人們總是喜歡美女帥哥一樣。為了追求美為
    了減少 bug,因此寫完了代碼,我們還要寫一些單元測試,然后一個個的運行來檢驗代碼質量。
  • 再優雅的代碼也是要出來賣的。我們后面還需要把代碼與各種配置文件、資源整合到一起,定型
    打包,如果是 web 項目,還需要將之發布到服務器,供人蹂躪。
    試想,如果現在有一種工具,可以把你從上面的繁瑣工作中解放出來,能幫你構建工程,管理 jar
    包,編譯代碼,還能幫你自動運行單元測試,打包,生成報表,甚至能幫你部署項目,生成 Web 站點,你會心動嗎?Maven 就可以解決上面所提到的這些問題。

Maven 的依賴管理

Maven 的一個核心特性就是依賴管理。當我們涉及到多模塊的項目(包含成百個模塊或者子項目),管理依賴就變成
一項困難的任務。Maven 展示出了它對處理這種情形的高度控制。
傳統的 WEB 項目中,我們必須將工程所依賴的 jar 包復制到工程中,導致了工程的變得很大。
分析如下:


圖一.png

Maven 的使用

Maven 的安裝

Maven 軟件的下載

為了使用 Maven 管理工具,我們首先要到官網去下載它的安裝軟件。通過百度搜索“Maven“如下:
點擊 Download 鏈接,就可以直接進入到 Maven 軟件的下載頁面:


圖二.png
圖三.png

Maven 軟件的安裝

Maven 下載后,將 Maven 解壓到一個沒有中文沒有空格的路徑下,比如 D:\software\maven 下面。
解壓后目錄結構如下:


  • bin:存放了 maven 的命令,比如我們前面用到的 mvn tomcat:run
  • boot:存放了一些 maven 本身的引導程序,如類加載器等
  • conf:存放了 maven 的一些配置文件,如 setting.xml 文件
  • lib:存放了 maven 本身運行所需的一些 jar 包

至此我們的 maven 軟件就可以使用了,前提是你的電腦上之前已經安裝并配置好了 JDK。


圖四.png

Maven 及 JDK 配置

電腦上需安裝 java 環境,安裝 JDK1.7 + 版本 (將JAVA_HOME/bin 配置環境變量 path ),我們使用的是 JDK8 相關版本配置 MAVEN_HOME ,變量值就是你的 maven 安裝 的路徑(bin 目錄之前一級目錄)上面配置了我們的 Maven 軟件,注意這個目錄就是之前你解壓 maven 的壓縮文件包在的的目錄,最好不要有中文和空格。
再次檢查 JDK 的安裝目錄。


圖五.png

圖六.png

Maven 軟件版本測試

通過 mvn -v命令檢查 maven 是否安裝成功,看到 maven 的版本為 3.5.2 及 java 版本為 1.8 即為安裝成功。找開 cmd 命令,輸入 mvn –v命令,如下圖:


圖七.png

我們發現 maven 的版本,及 jdk 的版本符合要求,這樣我們的 maven 軟件安裝就成功了。

Maven 倉庫

Maven 倉庫的分類

maven 的工作需要從倉庫下載一些 jar 包,如下圖所示,本地的項目 A、項目 B 等都會通過 maven
軟件從遠程倉庫(可以理解為互聯網上的倉庫)下載 jar 包并存在本地倉庫,本地倉庫 就是本地文
件夾,當第二次需要此 jar 包時則不再從遠程倉庫下載,因為本地倉庫已經存在了,可以將本地倉庫
理解為緩存,有了本地倉庫就不用每次從遠程倉庫下載了。

下圖描述了 maven 中倉庫的類型:


圖八.png
  • 本地倉庫 :用來存儲從遠程倉庫或中央倉庫下載的插件和 jar 包,項目使用一些插件或 jar 包,優先從本地倉庫查找

  • 默認本地倉庫位置在 {user.dir}/.m2/repository,{user.dir}表示 windows 用戶目錄。

    圖九.png

  • 遠程倉庫:如果本地需要插件或者 jar 包,本地倉庫沒有,默認去遠程倉庫下載。
    遠程倉庫可以在互聯網內也可以在局域網內。

  • 中央倉庫 :在 maven 軟件中內置一個遠程倉庫地址 http://repo1.maven.org/maven2 ,它是中央倉庫,服務于整個互聯網,它是由 Maven 團隊自己維護,里面存儲了非常全的 jar 包,它包含了世界上大部分流行的開源項目構件。

Maven 本地倉庫的配置

本課程是在無網的狀態下學習,需要配置資料提供的本地倉庫,將 “repository.rar”解壓至自己的電腦上,我們解壓在 D:\repository 目錄下(可以放在沒有中文及空格的目錄下)。


圖十.png

在 MAVE_HOME/conf/settings.xml 文件中配置本地倉庫位置(maven 的安裝目錄下):


圖十一.png

打開 settings.xml文件,配置如下:


圖十二.png

全局 setting 與用戶 setting


maven 倉庫地址、私服等配置信息需要在 setting.xml 文件中配置,分為全局配置和用戶配置。

在 maven 安裝目錄下的有 conf/setting.xml 文件,此 setting.xml 文件用于 maven 的所有 project項目,它作為 maven 的全局配置。

如需要個性配置則需要在用戶配置中設置,用戶配置的 setting.xml 文件默認的位置在:{user.dir} /.m2/settings.xml 目錄中,{user.dir} 指 windows 中的用戶目錄。

maven 會先找用戶配置,如果找到則以用戶配置文件為準,否則使用全局配置文件。


圖十三.png

Maven 工程的認識

Maven 工程的目錄結構

圖一.png

作為一個 maven 工程,它的 src 目錄和 pom.xml 是必備的。
進入 src 目錄后,我們發現它里面的目錄結構如下:

圖二.png

  • src/main/java —— 存放項目的.java 文件
  • src/main/resources —— 存放項目資源文件,如 spring, hibernate 配置文件
  • src/test/java —— 存放所有單元測試.java 文件,如 JUnit 測試類
  • src/test/resources —— 測試資源文件
  • target —— 項目輸出位置,編譯后的 class 文件會輸出到此目錄
  • pom.xml——maven 項目核心配置文件
  • 注意:如果是普通的 java 項目,那么就沒有 webapp 目錄。

Maven 工程的運行

進入 maven 工程目錄(當前目錄有 pom.xml 文件),運行 tomcat:run 命令。


圖三.png

問題處理

如果本地倉庫配置錯誤會報下邊的錯誤


圖四.png

分析:
maven 工程運行先從本地倉庫找 jar 包,本地倉庫沒有再從中央倉庫找,上邊提示 downloading…
表示 從中央倉庫下載 jar,由于本地沒有聯網,報錯。

解決:
在 maven 安裝目錄的 conf/setting.xml 文件中配置本地倉庫,參考:“maven 倉庫/配置本地倉庫章節”。

Maven 常用命令

我們可以在 cmd 中通過一系列的 maven 命令來對我們的 maven-helloworld 工程進行編譯、測試、運
行、打包、安裝、部署。

compile

compile 是 maven 工程的編譯命令,作用是將 src/main/java 下的文件編譯為 class 文件輸出到 target目錄下。
cmd 進入命令狀態,執行 mvn compile,如下圖提示成功:


圖五.png

查看 target 目錄,class 文件已生成,編譯完成。


圖六.png

test

test 是 maven 工程的測試命令 mvn test,會執行 src/test/java 下的單元測試類。cmd 執行 mvn test 執行 src/test/java 下單元測試類,下圖為測試結果,運行 1 個測試用例,全部成功。


圖七.png

clean

clean 是 maven 工程的清理命令,執行 clean 會刪除 target 目錄及內容。

package

package 是 maven 工程的打包命令,對于 java 工程執行 package 打成 jar 包,對于 web 工程打成 war
包。

install

install 是 maven 工程的安裝命令,執行 install 將 maven 打成 jar 包或 war 包發布到本地倉庫。從運行結果中,可以看出,當后面的命令執行時,前面的操作過程也都會自動執行。

Maven 指令的生命周期

maven 對項目構建過程分為三套相互獨立的生命周期,請注意這里說的是“三套”,而且“相互獨立”。


這三套生命周期分別是:

  1. Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
  2. Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
  3. Site Lifecycle 生成項目報告,站點,發布站點。

maven 的概念模型

Maven 包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命周期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命周期階段(phase)中插件(plugin)目標(goal)的邏輯。


圖八.png
  • 項目對象模型 (Project Object Model)
    一個 maven 工程都有一個 pom.xml 文件,通過 pom.xml 文件定義項目的坐標、項目依賴、項目信息、
    插件目標等。
  • 依賴管理系統(Dependency Management System)
    通過 maven 的依賴管理對項目所依賴的 jar 包進行統一管理。
    比如:項目依賴 junit4.9,通過在 pom.xml 中定義 junit4.9 的依賴即使用 junit4.9,如下所示是 junit4.9
    的依賴定義:
<!-- 依賴關系 -->
<dependencies>
<!-- 此項目運行使用 junit,所以此項目依賴 junit -->
<dependency>
<!-- junit 的項目名稱 -->
<groupId>junit</groupId>
<!-- junit 的模塊名稱 -->
<artifactId>junit</artifactId>
<!-- junit 版本 -->
<version>4.9</version>
<!-- 依賴范圍:單元測試時使用 junit -->
<scope>test</scope>
</dependency>
  • 一個項目生命周期(Project Lifecycle)
    使用 maven 完成項目的構建,項目構建包括:清理、編譯、測試、部署等過程,maven 將這些過程規范為一個生命周期,如下所示是生命周期的各各階段:


    圖九.png

maven 通過執行一些簡單命令即可實現上邊生命周期的各各過程,比如執行 mvn compile 執行編譯、執行 mvn clean 執行清理。

  • 一組標準集合

maven 將整個項目管理過程定義一組標準,比如:通過 maven 構建工程有標準的目錄結構,有標準的生命周期階段、依賴管理有標準的坐標定義等。

  • 插件(plugin)目標(goal)

maven 管理項目生命周期過程都是基于插件完成的。

idea 開發 maven 項目

idea 的 maven 配置

打開FileSettings 配置 maven

依據圖片指示,選擇本地 maven 安裝目錄,指定 maven 安裝目錄下 conf 文件夾中 settings 配置文件。


圖十.png

idea 中創建一個 maven 的 web 工程

打開 idea,選擇創建一個新工程


圖十一.png

選擇 idea 提供好的 maven 的web 工程模板


圖十二.png

點擊 Next 填寫項目信息


圖十三.png

點擊 Next,此處不做改動。


圖十四.png

點擊 Next 選擇項目所在目錄


圖十五.png

點擊 Finish 后開始創建工程,耐心等待,直到出現如下界面。


圖十六.png

手動添加 src/main/java 目錄,如下圖右鍵 main 文件夾》New》Directory


圖十七.png

創建一個新的文件夾命名為 java


圖十八.png

點擊 OK 后,在新的文件夾 java 上右鍵>Make Directory as>Sources Root


圖十九.png

創建一個 Servlet

src/java/main 創建了一個 Servlet,但報錯


圖一.png

要解決問題,就是要將 servlet-api-xxx.jar 包放進來,作為 maven 工程應當添加 servlet 的坐標,從而導入它的 jar

在 pom.xml 文件添加坐標

直接打開 hello_maven 工程的 pom.xml 文件,再添加坐標


圖二.png

添加 jar 包的坐標時,還可以指定這個 jar 包將來的作用范圍。
每個 maven 工程都需要定義本工程的坐標,坐標是 maven 對 jar 包的身份定義,比如:入門程序的

坐標定義如下:
<!--項目名稱,定義為組織名+項目名,類似包名-->
<groupId>com.itheima</groupId>
<!-- 模塊名稱 -->
<artifactId>hello_maven</artifactId>
<!-- 當前項目版本號,snapshot 為快照版本即非正式版本,release 為正式發布版本 -->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包類型
jar:執行 package 會打成 jar 包
war:執行 package 會打成 war 包
pom :用于 maven 工程的繼承,通常父工程設置為 pom

坐標的來源方式

添加依賴需要指定依賴 jar 包的坐標,但是很多情況我們是不知道 jar 包的的坐標,可以通過如下方
式查詢:

從互聯網搜索
  1. http://search.maven.org/
  2. http://mvnrepository.com/
    圖三.png

依賴范圍

A 依賴 B,需要在 A 的 pom.xml 文件中添加 B 的坐標,添加坐標時需要指定依賴范圍,依賴范圍包
括:

  • compile:編譯范圍,指 A 在編譯時依賴 B,此范圍為默認依賴范圍。編譯范圍的依賴會用在
    編譯、測試、運行,由于運行時需要所以編譯范圍的依賴會被打包。

  • provided:provided 依賴只有在當 JDK 或者一個容器已提供該依賴之后才使用, provided 依
    賴在編譯和測試時需要,在運行時不需要,比如:servlet api 被 tomcat 容器提供。

  • runtime:runtime 依賴在運行和測試系統的時候需要,但在編譯的時候不需要。比如:jdbc
    的驅動包。由于運行時需要所以 runtime 范圍的依賴會被打包。

  • test:test 范圍依賴 在編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用,
    比如:junit。由于運行時不需要所以 test范圍依賴不會被打包。

  • system:system 范圍依賴與 provided 類似,但是你必須顯式的提供一個對于本地系統中 JAR
    文件的路徑,需要指定 systemPath 磁盤路徑,system依賴不推薦使用。


    圖四.png

在 maven-web 工程中測試各各 scop。
測試總結:

  • 默認引入 的 jar 包 ------- compile 【默認范圍 可以不寫】(編譯、測試、運行 都有效 )
  • servlet-api 、jsp-api ------- provided (編譯、測試 有效, 運行時無效 防止和 tomcat 下 jar 沖突)
  • jdbc 驅動 jar 包 ---- runtime (測試、運行 有效 )
  • junit ----- test (測試有效)
    依賴范圍由強到弱的順序是:compile>provided>runtime>test

項目中添加的坐標

圖五.png

設置 jdk 編譯版本

本教程使用 jdk1.8,需要設置編譯版本為 1.8,這里需要使用 maven 的插件來設置:
在 pom.xml 中加入:

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>

編寫 servlet

在 src/main/java 中創建 ServletTest


圖六.png

編寫 jsp

圖七.png

在 web.xml 中配置 servlet 訪問路徑

圖八.png

添加 tomcat7 插件

在 pom 文件中添加如下內容


圖九.png

  • 此時點擊 idea 最右側 Maven Projects,
  • 就可以看到我們新添加的 tomcat7 插件
  • 雙擊 tomcat7插件下 tomcat7:run 命令直接運行項目

圖十.png

也可以直接點擊如圖按鈕,手動輸入 tomc7:run 命令運行項目


圖十一.png

maven 工程運行調試

端口占用處理

重新執行 tomcat:run 命令重啟工程,重啟之前需手動停止 tomcat,否則報下邊的錯誤


圖十二.png

斷點調試

點擊如圖所示選項


圖十三.png

在彈出框中點擊如圖加號按鈕找到 maven 選項


圖十四.png

在彈出窗口中填寫如下信息


圖十五.png

完成后先 Apply 再 OK 結束配置后,可以在主界面找到我們剛才配置的操作名稱。


圖十六.png

如上圖紅框選中的兩個按鈕,左側是正常啟動,右側是 debug 啟動。

總結

maven 倉庫

  1. maven 倉庫的類型有哪些?
  2. maven 工程查找倉庫的流程是什么?
  3. 本地倉庫如何配置?

常用的 maven 命令


  1. 常用 的 maven 命令包括:
    • compile:編譯
    • clean:清理
    • test:測試
    • package:打包
    • install:安裝

坐標定義

在 pom.xml 中定義坐標,內容包括:groupId、artifactId、version,詳細內容如下:

<!--項目名稱,定義為組織名+項目名,類似包名-->
<groupId>cn.itcast.maven</groupId>
<!-- 模塊名稱 -->

<artifactId>maven-first</artifactId>
<!-- 當前項目版本號,snapshot 為快照版本即非正式版本,release 為正式發布版本 -->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包類型
jar:執行 package 會打成 jar 包
war:執行 package 會打成 war 包
pom :用于 maven 工程的繼承,通常父工程設置為 pom
5.4 pom 基本配置
pom.xml 是 Maven 項目的核心配置文件,位于每個工程的根目錄,基本配置如下:
<project > :文件的根節點 .
<modelversion > : pom.xml 使用的對象模型版本
<groupId > :項目名稱,一般寫項目的域名
<artifactId > :模塊名稱,子項目名或模塊名稱
<version > :產品的版本號 . 
<packaging > :打包類型,一般有 jar、war、pom 等
<name > :項目的顯示名,常用于 Maven 生成的文檔。 
<description > :項目描述,常用于 Maven 生成的文檔
<dependencies> :項目依賴構件配置,配置項目依賴構件的坐標
<build> :項目構建配置,配置編譯、運行插件等。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容