•寫在前面
Maven是一個項目管理工具,它包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命週期階段(phase)中插件(plugin)目標(goal)的邏輯。當你使用Maven的時候,你用一個明確定義的項目對象模型來描述你的項目,然後Maven可以應用橫切的邏輯,這些邏輯來自一組共享的(或者自定義的)插件。
Maven 有一個生命週期,當你運行 mvn install 的時候被調用。這條命令告訴Maven 執行一系列的有序的步驟,直到到達你指定的生命週期。遍歷生命週期旅途中的一個影響就是,Maven 運行了許多默認的插件目標,這些目標完成了像編譯和創建一個 JAR 文件這樣的工作。
此外,Maven能夠很方便的幫你管理項目報告,生成站點,管理JAR文件,等等。
介紹Maven
相信我們都開發過一個java web項目,我們可以把傳統的開發方式以及過程總結成一下幾點
- 在IDEA中創建一個java web工程
- 在工程中編寫源代碼及配置文件等
- 對源代碼進行編譯,java文件編譯成class文件
- 執行Junit單元測試
- 將工程打成war包部署至tomcat運行
而當我們使用Maven作爲構建工具,即把動態的Web工程經過編譯得到的編譯結果部署到服務器上的整個過程,這整個過程如下,這些過程可以實現自動化完成
- 編譯:java源文件[.java]->編譯->Classz字節碼文件[.class]
- 部署:最終在sevlet容器中部署的不是動態web工程,而是編譯後的文件
- 清理clean:將以前編譯得到的舊文件class字節碼文件刪除
- 編譯compile:將java源程序編譯成class字節碼文件
- 測試test:自動測試,自動調用junit程序
- 報告report:測試程序執行的結果
- 打包package:動態Web工程打War包,java工程打jar包
- 安裝install:Maven特定的概念-----將打包得到的文件複製到“倉庫”中的指定位置
- 部署deploy:將動態Web工程生成的war包複製到Servlet容器下,使其可以運行
有了Maven的協助,我們可以實現一個命令完成構建、運行,方便快捷,並且maven對每個構建階段進行規範,非常有利於大型團隊協作開發。
Maven的優勢
一個項目就是一個工程: 如果項目非常龐大,就不適合使用package來劃分模塊,最好是每一個模塊對應一個工程,利於分工協作。藉助於maven就可以將一個項目拆分成多個工程
改變了原來jar引入的麻煩: 同樣的jar包重複的出現在不同的項目工程中,你需要做不停的複製粘貼的重複工作。藉助於maven,可以將jar包保存在“倉庫”中,不管在哪個項目只要使用引用即可就行。
jar下載: 藉助於maven我們可以使用統一的規範方式下載jar包,規範
jar包版本控制: 不同的項目在使用jar包的時候,有可能會導致各個項目的jar包版本不一致,導致未執行錯誤。藉助於maven,所有的jar包都放在“倉庫”中,所有的項目都使用倉庫的一份jar包。
簡化jar包依賴: 比如FileUpload組件的IO組件,commons-fileupload-1.3.jar依賴於commons-io-2.0.1.jar。極大的浪費了我們導入包的時間成本,也極大的增加了學習成本。藉助於maven,它會自動的將依賴的jar包導入進來。
這裏藉助網上的一張圖說明一下
Maven安裝
我們可以試着先執行 mvn -v 指令查看我們是否有安裝Maven,這個指令用來查看Maven的版本。
首先第一步當然是下載Maven啦,這裏我附上Maven官方的下載地址選擇如下版本
記得檢查一下當前系統是否配置JAVA_HOME的環境變量,下載好Maven之後,解壓Maven放在一個非中文無空格的路徑下,我自己是放在了D盤,下一步就是配置Maven的相關環境變量,很簡單,在環境變量增加M2_HOME,路徑是Maven解壓後的根目錄,在環境變量裏的path中增加maven/bin的目錄,我自己是直接在Path中加了Maven的bin的絕對路徑,沒有弄M2_HOME,我這樣方便點,上面那樣是正規一點,如下。
安裝之後,執行 mvn -v 查看Maven版本,我自己的是Maven3.5.4
Maven倉庫
這裏要介紹一下Maven倉庫的概念,Maven的工作需要從倉庫下載一些jar包,如下圖所示,本地的項目A、項目B等都會通過maven軟件從遠程倉庫(可以理解爲互聯網上的倉庫)下載jar包並存在本地倉庫,本地倉庫 就是本地文件夾,當第二次需要此jar包時則不再從遠程倉庫下載,因爲本地倉庫已經存在了,可以將本地倉庫理解爲緩存,有了本地倉庫就不用每次從遠程倉庫下載了
- 本地倉庫就是用來存儲從遠程倉庫或中央倉庫下載的插件和jar包,項目使用一些插件或jar包,優先從本地倉庫查找。
- 遠程倉庫則是,如果本地需要插件或者jar包,本地倉庫沒有,默認去遠程倉庫下載。遠程倉庫可以在互聯網內也可以在局域網內。默認本地倉庫位置在 ${user.dir}/.m2/repository,${user.dir}表示windows用戶目錄。
- 中央倉庫 則是在maven軟件中內置一個遠程倉庫地址http://repo1.maven.org/maven2 ,它是中央倉庫,服務於整個互聯網,它是由Maven團隊自己維護,裏面存儲了非常全的jar包,它包含了世界上大部分流行的開源項目構件。
配置Maven倉庫
我們在Maven的安裝目錄下,創建一個repository,如下
然後在Maven的安裝目錄下找到conf目錄下的settings.xml配置文件,打開此文件配置本地倉庫的路徑,配置內容如下
Maven配置阿里源
Maven因爲是中央庫在國外,所以我們在加載一些依賴的時候會很慢,這裏配置一下阿里源。我們在Maven的安裝目錄下,打開setting.xml,找到,在下面加上這一段信息
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
Maven常用命令
Maven命令列表 | 說明 |
---|---|
mvn –version | 顯示版本信息 |
mvn clean | 清理項目生產的臨時文件,一般是模塊下的target目錄 |
mvn compile | 編譯源代碼,一般編譯模塊下的src/main/java目錄 |
mvn package | 項目打包工具,會在模塊下的target目錄生成jar或war等文件 |
mvn test | 測試命令,或執行src/test/java/下junit的測試用例 |
mvn install | 將打包的jar/war文件複製到你的本地倉庫中,供其他模塊使用 |
mvn deploy | 將打包的文件發佈到遠程參考,提供其他人員進行下載依賴 |
mvn site | 生成項目相關信息的網站 |
mvn eclipse:eclipse | 將項目轉化爲Eclipse項目 |
mvn dependency:tree | 打印出項目的整個依賴樹 |
mvn archetype:generate | 創建Maven的普通java項目 |
mvn tomcat:run | 在tomcat容器中運行web應用 需要插件支持 只有tomcat1.7的插件,沒有1.8的,所以tomcat8.0用不了此命令 |
mvn jetty:run | 調用 Jetty 插件的 Run 目標在 Jetty Servlet 容器中啓動 web 應用 |
值得一提的是,運行maven命令的時候,首先需要定位到maven項目的目錄,也就是項目的pom.xml文件所在的目錄。否則,必以通過參數來指定項目的目錄,如下。
以上就是安裝和配置的全過程,當然了,在真實的開發中,我們都是會在軟件中採用圖形界面化的方式來運行Maven命令,比如我們的IDEA 幫我們集成好了Maven項目的管理模塊,那我們就可以使用IDEA來操作Maven項目了
Maven在Idea中說明
這裏值得一提的是,Maven構建的項目必須遵守如下的項目結構,這是Maven構建項目的約定
|-src
| |-main
| | |-java —— 存放項目的.java文件
| | |-resources —— 存放項目資源文件,如spring, hibernate配置文件
|-webapp —— webapp目錄是web工程的主目錄
|-WEB-INF
|-web.xml
| |-test
| |-java ——存放所有測試.java文件,如JUnit測試類
| |-resources —— 測試資源文件
|-target —— 目標文件輸出位置例如.class、.jar、.war文件
|-pom.xml ——maven項目核心配置文件
我們可以手動創建Maven項目,但必須遵守上面的目錄格式,但是我們一般是通過軟件幫我們創建的,不管是軟件創建,還是手動創建,都必須遵循Maven的目錄結構,如圖所示 IDEA 創建出來的Maven項目結構如下
pom.xml是一個maven工程都有一個pom.xml文件,通過pom.xml文件定義項目的座標、項目依賴、項目信息、插件目標等
依賴範圍的介紹
添加jar包的座標時,還可以指定這個jar包將來的作用範圍