什麼是Maven
Maven,鼎鼎大名,在今天之前,我對於它一直是處於一種"只聞其名不見其人"的狀態。之所以說"只聞其名",是因為Maven太有名了,它是Apache基金會的頂級專案,一般情況下,被Apache看中的都是精品。之所以說"不見其人",是因為之前的工作中不需要使用到Maven,因此對Maven並不熟。
正巧,最近換了工作,新工作中專案是使用Maven構建的,這讓我必須要會使用Maven。因此,本篇文章就零開始對Maven進行一個學習,在我學習的過程中,必然遇到很多問題,在思考、解決這些問題的同時,輸出一些文字,相信會對各位網友朋友們有幫助。
OK,那麼讓我們開始吧。
Maven的作用是什麼
這是我遇到的第一個問題,甚至在看了一些Maven的資料之後,我還是會有疑問,到底Maven是幹什麼用的?在繼續學習以及自己寫了例子之後,我有了一定的感悟,下面嘗試回答一下這個問題。首先,假如使用傳統的專案構建方式,可能會有這樣的困惑:
- 開發中,為了保證編譯通過,我們會到處去尋找jar包,當編譯通過了,執行的時候,卻發現"ClassNotFoundException",難道還差jar包?再去找找吧
- 每個Java專案的目錄結構都沒有一個統一的標準,配置檔案到處都是,單元測試程式碼到底應該放在那裡也沒有一個權威的規範
因此,我們就要用到Maven(使用Ant也可以,不過編寫Ant的xml指令碼比較麻煩)----一個專案管理工具。Maven主要做了兩件事:
- 統一開發規範與工具
- 統一管理jar包
下面我們來對比一下,首先建立一個普通的Java工程,是這樣的:
這個我們都很熟悉,src下建包寫程式碼,那麼配置檔案放在哪裡?單元測試程式碼放在哪裡?沒有一個統一標準,更多時候都是開發者的自由發揮,每個人有自己的風格,這並不十分適合團隊協作。接下來,看一下使用maven構建一個普通Java專案之後的目錄結構:
看到使用Maven構建的普通Java專案,對原始碼、單元測試程式碼、資源乃至後續需要的檔案都有專門的目錄規劃。
上面的最後有一個pom.xml,這是Maven的核心配置檔案,pom稱為Project Object Model(專案物件模型),它用於描述整個Maven專案,所以也稱為Maven描述檔案。
當然事情不會這麼簡單,接下來,繼續進入Maven的世界吧。
pom.xml
開啟pom.xml,最基礎的是這樣的:
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xrq.withmaven</groupId> <artifactId>withmaven</artifactId> <version>0.0.1-SNAPSHOT</version> <build/> </project>
因為這個配置檔案是Maven的核心,因此有必要詳細解讀一下pom.xml,來先看一下上面的幾個:
1、modelVersion
指定了當前Maven模型的版本號,對於Maven2和Maven3來說,它只能是4.0.0
2、groupId
顧名思義,這個應該是公司名或是組織名。一般來說groupId是由三個部分組成,每個部分之間以"."分隔,第一部分是專案用途,比如用於商業的就是"com",用於非營利性組織的就 是"org";第二部分是公司名,比如"tengxun"、"baidu"、"alibaba";第三部分是你的專案名
3、artifactId
可以認為是Maven構建的專案名,比如你的專案中有子專案,就可以使用"專案名-子專案名"的命名方式
4、version
版本號,SNAPSHOT意為快照,說明該專案還在開發中,是不穩定的版本。在Maven中很重要的一點是,groupId、artifactId、version三個元素生成了一個Maven專案的基本座標,這非常重要,我在使用和研究Maven的時候多次感受到了這點。
在上面的這些元素之外,還有一些元素,同樣羅列一下:
1、packing
專案打包的型別,可以使jar、war、rar、ear、pom,預設是jar
2、dependencies和dependency
前者包含後者。前面說了,Maven的一個重要作用就是統一管理jar包,為了一個專案可以build或執行,專案中不可避免的,會依賴很多其他的jar包,在Maven中,這些依賴就被稱為dependency。
說到這裡,就有一個本地倉庫和遠端倉庫的概念了。官方下載的本地倉庫的配置在"%MAVEN_HOME%\conf\settings.xml"裡面,找一下"localRepository"就可以了;MyEclipse預設的本地倉庫的地址在"{user.home}/.m2/repository"路徑下,同樣找一下"localRepository"就可以找到MyEclipse預設的本地倉庫了。
本地倉庫和遠端倉庫是這樣的,Maven工程首先會從本地倉庫中獲取jar包,當無法獲取指定jar包時,本地倉庫會從遠端倉庫(中央倉庫)中下載jar包,並放入本地倉庫以備將來使用。
舉個例子,比方說我的專案中用到了MyBatis,那麼可以這麼配置:
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.5</version> </dependency> </dependencies>
之前有說過groupId、artifactId、version唯一標識一個Maven專案,有了這三個元素,我們就可以去遠端倉庫下載MyBatis3.2.5.jar到本地倉庫了。回想我們之前的做法,如果要MyBatis的jar包,發現沒有,然後去網上下載一個,需要另外的jar包,然後去網上下載一個,但是有了Maven,就方便多了,只需要配置jar包對應的dependency依賴,Maven會自動幫助我們去遠端倉庫中下載jar包到本地倉庫中。
3、properties
properties是用來定義一些配置屬性的,例如project.build.sourceEncoding(專案構建原始碼編碼方式),可以設定為UTF-8,防止中文亂碼,也可定義相關構建版本號,便於日後統一升級。
4、build
build表示與構建相關的配置,比如build下有finalName,表示的就是最終構建之後的名稱。
Maven工程目錄結構
回到上面那張圖:
接著解釋一下Maven的目錄結構:
- main目錄下是專案的主要程式碼,test目錄下存放測試相關的程式碼
- 編譯輸出後的程式碼會放在target目錄下
- src/main/java下存放Java程式碼,src/main/resources下存放配置檔案
- 這裡沒有webapp,Web專案會有webapp目錄,webapp下存放Web應用相關程式碼
- pom.xml是Maven專案的配置檔案
Maven環境配置
常用的開發工具Idea、MyEclipse裡面都已經整合了Maven了,不過最好是從官網下一個配置到自己電腦裡,開發工具裡的可能有少許的Bug。
首先去Maven官網,下載Maven的包,地址為http://maven.apache.org/download.cgi,找到下面的部分,點選就可以下載了:
下載完解壓,然後配置一下環境變數,和JDK的環境變數配置類似:
這樣配置完就可以了,驗證一下,windows+r開啟命令視窗,輸入"mvn --version",如果有下面的內容這表示Maven配置OK:
Maven入門使用常見問題
1、我從SVN/Git上下載了一個以Maven構建的工程,下載完畢沒有jar包怎麼辦?
從資源庫上下載下來的Maven工程,是沒有jar包的,此時可以這麼做:
(1)刪除Maven工程,但是刪除的時候不要刪除本地工程裡面的Maven工程,只刪除MyEclipse中的Maven工程
(2)右鍵Import->Maven4MyEclipse->Existing Maven Projects,匯入你的Maven工程,此時MyEclipse在構建工程的時候,假如你的本地倉庫中沒有dependcy中的jar包,便會去遠端倉庫下載jar包到本地倉庫中。你的工程匯入完畢之後,Library應該是這樣的:
2、重新下載Maven工程所依賴的jar包、匯入jar包都需要觸發Maven工程的build workspace,那麼如何才能觸發Maven工程的build workspace?
找到一個pom.xml,隨便修改一下,加一個空格、減一個空格什麼的,ctrl+s儲存一下,便會觸發Maven工程的build workspace了
3、本地倉庫的目錄結構是什麼樣子的?
groupId、artifactId、version確定一個唯一的Maven,比方說我有一個mybatis的dependcy:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.5</version> </dependency>
那麼mybatis的jar包應該在%Maven倉庫地址%\org\mybatis\mybatis\3.2.5\這一路徑下,看到了吧,先groupId,再mybatis,最後version,每個名字都是一個資料夾的名字
4、有些jar包在dependcy裡面有配置,Import了Maven工程,下載完工程所依賴的jar包之後,發現本地倉庫裡面卻沒有,怎麼辦?
可能是原先下載jar包的時候出了什麼問題,從artifactId目錄開始刪除以下的所有檔案/資料夾,然後觸發一次Maven工程的build workspace就可以了
5、本地倉庫中確定已經有jar包了,工程裡面卻報錯,說找不到jar包,該怎麼辦?
應該有很多解決辦法,目前解決的一種辦法是,MyEclipse->Window->Preferences->搜尋Maven->User Settings,Update Settings和Reindex點一下就好了。另外,可以嘗試一下把本地Maven倉庫內的jar包刪除一下,然後重新build workspace,可能也可以。