Maven學習筆記(一)—— Maven基礎
一、Maven介紹
1.1 什麼是maven?
Maven是apache下的一個純Java開發的開源專案,它是一個專案管理工具,使用maven對Java專案進行構建、依賴管理。
1.2 什麼是專案構建?
專案構建是一個專案從編寫原始碼到編譯、測試、執行、打包、部署、執行的過程。
- 傳統專案構建過程
傳統使用eclipse構建專案的過程如下:
構建過程如下:
-
- 在eclipse中建立一個javaweb工程
- 在工程中編寫原始碼及配置檔案等
- 對原始碼進行編譯,java檔案編譯成class檔案
- 執行Junit單元測試
- 將工程打包成war包部署至tomcat執行
- maven專案構建過程
maven將專案構建的過程進行標準化,每個階段使用一個m命令完成,下圖展示了構建過程的一些階段:
上圖中部分階段對應的命令如下:
清理階段:clean,清理輸出的class檔案
編譯階段:compile,將java程式碼編譯成class檔案
打包階段:package,java工程可以打成jar包,web工程可以打成war包
執行一個maven工程(web工程)需要一個命令:tomcat:run
1.3 什麼是依賴管理
什麼是依賴?一個java專案可能要使用一些第三方的jar包才可以執行,那麼我們說這個java專案依賴了這些第三方jar包。
舉個例子:一個crm系統,它的架構是SSH框架,該crm專案依賴SSH框架,具體它依賴的是hibernate、spring、struts2。
什麼是依賴管理?就是對專案所有依賴的jar包進行規範化管理。
- 傳統專案的依賴管理
傳統的專案工程要管理所依賴的jar包完全靠人工進行,程式設計師從網上下載jar包新增到專案工程中,如下圖:程式設計師手工將hibernate、spring、struts2的jar包新增到工程中的WEB-INF/lib目錄下。
手工拷貝jar包新增到工程中的問題是:
-
- 沒有對jar包的版本統一管理,容易導致版本衝突。
- 從網上找jar包非常不方便,有些jar包找不到。
- jar包新增到工程中導致工程過大。
- maven專案的依賴管理
maven專案管理所依賴的jar包不需要手動向工程新增jar包,只需要在pom.xml(maven工程的配置檔案)新增jar包的座標,自動從maven倉庫中下載jar包、執行,如下圖:
使用maven依賴管理新增jar包的好處:
-
- 通過pom.xml檔案對jar包的版本進行統一管理,可避免版本衝突。
- maven團隊維護了一個非常全的maven倉庫,裡面包含了當前使用的jar包,maven工程可以自動從maven倉庫下載jar包,非常方便。
- 使用maven的專案工程非常小
1.4 使用maven的好處
- 一步構建:maven對專案構建的過程進行標準化,通過一個命令即可完成構建過程。
- 依賴管理:maven工程不用手動匯入jar包,通過在pom.xml中定義座標從maven倉庫自動下載,方便且不易出錯。
- 可以跨平臺:可在window、Linux上使用。
- 有利於提高大型團隊的開發效率,降低專案的維護成本,大公司都會考慮使用maven來構建專案。
二、maven的安裝
安裝需要Java支援(JDK >= 1.7)
2.1 下載安裝
- 下載壓縮包:
官方下載地址:http://maven.apache.org/download.cgi
- 解壓安裝:
將下載好的壓縮包解壓到一個不含有中文和空格的目錄中。
bin:mvn.bat(以run方式執行專案)、mvnDeug.bat(以debug方式執行專案)
boot:maven執行需要類載入器
conf:settings.xml,整個maven工具核心配置檔案
lib:maven執行所依賴的jar包
2.2 配置環境變數
計算機』-->『右鍵屬性』-->『高階系統設定』-->『環境變數』-->『系統變數』
將%MAVEN_HOME%\bin新增到path中:
通過mvn -v命令檢查maven是否安裝成功,看到maven的版本為3.3.9及java版本為1.7即為安裝成功。
2.3 maven倉庫
2.3.1 maven倉庫的作用
maven的工作需要從倉庫下載一些jar包,如下圖所示,本地的專案A、專案B等都會通過maven軟體從遠端倉庫(可以理解為網際網路上的倉庫)下載jar包並存在本地倉庫,本地倉庫就是本地資料夾,當第二次需要此jar包時則不再從遠端倉庫下載,因為本地倉庫已經存在了,可以將本地倉庫理解為快取,有了本地倉庫就不用每次從遠端倉庫下載了。
下圖描述了maven中倉庫的型別:
- 本地倉庫:用來儲存從遠端倉庫或中央倉庫下載的外掛和jar包,專案使用的外掛或jar包,優先從本地倉庫查詢。預設本地倉庫位置在${user.dir}/.m2/reposity,${user.dir}表示Windows使用者目錄
- 遠端倉庫:如果本地需要外掛或者jar包,本地倉庫沒有,預設去遠端倉庫下載。遠端倉庫可以在網際網路內也可以在區域網內。
- 中央倉庫:在maven軟體中內建一個遠端倉庫地址http://repo1.maven.org/maven2,它是中央倉庫,服務於整個網際網路,它是由maven團隊自己維護的,裡面儲存了非常全的jar包,它包含了世界上大部分流行的開源專案構件。
2.3.2 配置本地倉庫
將準備好的本地倉庫(repository.rar)解壓到自己的電腦上
在MAVEN_HOME/conf/settings.xml檔案中配置本地倉庫位置:
三、入門程式
3.1 maven的目錄結構
使用maven建立的工程我們稱它為maven工程,maven工程具有一定的目錄規範,如下:
3.2 maven的常用命令
- compile:compile是maven工程的編譯命令,作用是將src/main/java下的檔案編譯為class檔案輸出到target目錄下
檢視target目錄,class檔案已生成,編譯完成。
- test:test是maven工程的測試命令,會執行src/test/java下的單元測試類
- clean:執行clean會刪除target目錄的內容。
- package:package是maven工程的打包命令,對於Java工程執行package會打包成jar包,對於web工程,會打包成war包。
- install:install是maven工程的安裝命令,執行install將maven打成jar或war包釋出到本地倉庫。
四、專案構建
4.1 m2e外掛安裝配置
4.1.2 eclipse與maven
通過入門程式中命令列的方式使用maven的工作效率不高,可以在eclipse開發工具中整合maven軟體,eclipse是一個開發工具,maven是一個專案管理工具,maven有一套專案構建的規範,在eclipse中整合maven軟體,最終通過eclipse建立maven工程。
4.1.3 安裝外掛
1.選擇3.3.9版本的maven軟體
2.修改預設的本地倉庫地址
注意:如果修改了settings.xml檔案,需要點選上圖的"Update Settings"按鈕對本地倉庫重建索引,點選"Reindex"。
3.maven配置完成需要測試在eclipse中是否可以瀏覽maven的本地倉庫,如果可以正常瀏覽maven本地倉庫,則說明eclipse整合maven已經完成。
開啟eclipse倉庫檢視
找到Local respository本地倉庫項,點選Rebuild index重建索引
重建索引完成後即可檢視本地倉庫內容:
4.2 構建web工程
第一步:建立一個maven工程
第二步:定義座標
第三步:設定編譯版本:檢視上邊工程的編譯版本為1.5,此教程的是jdk1.7,需要設定編譯版本為1.7,這裡需要使用maven的外掛來設定。在pom.xml中加入:
<build> <!-- 配置了很多外掛 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
執行update project,檢視編譯版本為1.7:
第四步:定義web.xml:在src/webapp中新增WEB-INF/web.xml檔案,可以右鍵專案自動生成
第五步:新增servlet/jsp的jar包,在pom.xml中新增servlet/jsp的座標
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> </dependencies>
此時會發現jar包已新增到專案中:
第六步:編寫servlet,在src/main/java中建立ServletTest。
public class ServletTest extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getRequestDispatcher("/jsp/test.jsp").forward(req, resp); } }
第七步:編寫jsp
第八步:在web.xml中配置servlet
<!-- 配置servlet --> <servlet> <servlet-name>servletTest</servlet-name> <servlet-class>cn.itcast.maven.ServletTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletTest</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
第九步:啟動專案:右擊專案---run as –maven build ….
測試:
五、依賴管理
5.1 新增依賴
5.1.1 dependency
在pom.xml中新增dependency標籤:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency>
5.1.2 查詢座標
新增依賴需要指定依賴jar包的座標,但是很多情況下我們是不知道jar包的座標,可以通過如下方式查詢:
- 方式一:從網際網路搜尋https://mvnrepository.com/
- 方式二:使用maven外掛的索引功能
如果在本地倉庫中有我們要的jar包,可以在pom.xml中右鍵新增依賴
5.2 依賴範圍
A依賴B,需要在A的pom.xml檔案中新增B的座標,新增座標時需要指定依賴範圍,依賴範圍包括:
- compile:編譯範圍,指A在編譯時依賴B,此範圍為預設依賴範圍。編譯範圍的依賴會用在編譯、測試、執行,由於執行時需要,所以編譯範圍的依賴會被打包。
- provided:provided依賴只有在當JDK或者一個容器已提供該依賴之後才使用,provided依賴在編譯和測試時需要,在執行時不需要(防止和tomcat下的jar包衝突),比如:servlet api被tomcat容器提供。
- runtime:runtime依賴在執行和測試系統的時候需要,但在編譯的時候不需要。比如jdbc的驅動包,由於執行時需要,所以runtime範圍的依賴會被打包。
- test:test範圍依賴在編譯和執行的時候都不需要,它們只有在測試編譯和測試執行階段可用。比如:junit,由於執行時不需要,所以test範圍的依賴不會被打包
- system:system範圍依賴與provided類似,但是你必須顯示的提供一個對於本地系統中JAR檔案的路徑,需要指定systemPath磁碟路徑,system依賴不推薦使用。
依賴範圍由強到弱的順序是:compile>provided>runtime>test