初識Maven及入門

最近用到了Maven,就開始看看文檔,網上找找資料,看了些視頻。現在整理一下,僅供參考。


0x00 ? ?關于Maven

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.

這是官網上的一段關于Maven的介紹。經過幾天的折騰,我覺得Maven是一個開源的項目構建、管理工具,能夠讓團隊更加高效的合作開發項目。其核心是pom文件,擁有一系列強大的插件和一個中央倉庫。

古人說的好:紙上得來終覺淺,絕知此事要躬行。至于Maven是干什么用的,怎么用,我們下載一個,安裝好,用用就知道了。或許你能夠對Maven理解的更進一步。


0x01 ? ?安裝Maven

接下來說一下,在windows環境下,如何安裝Maven。選用的Maven版本是apache-maven-3.3.9。

-安裝JDK

-設置Java環境變量

-設置Maven環境變量


*安裝JDK

這個就沒什么好說了。=_=


*設置Java環境變量

Control Panel -> System and Security -> System -> Advanced system settings -> Enviroment Variables

系統變量下 ? ?{ 注:【】只是為了強調說明 }

新建CLASSPATH

值為【.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;】

新建JAVA_HOME?

值為【C:\Program Files\Java\jdk1.8.0_91】{備注:JDK的安裝目錄}

PATH后添加【%JAVA_HOME%\bin;】


*設置Maven環境變量

下載Maven并解壓

系統變量下? ? { 注:【】只是為了強調說明 }

新建MAVEN_HOME -> 值為【D:\Program Files\apache-maven-3.3.9】{備注:Maven所在目錄}

PATH后添加【%MAVEN_HOME%\bin;】

在命令行窗口中,使用mvn -v來查看一下maven的版本信息,如下圖所示:

mvn -v

說明maven已經安裝配置好了。

接下來說一下Maven的核心:pom文件。


0x02 ? ?pom.xml

就像Make的makefile一樣,Maven項目的核心是pom.xml。POM(Project Object Model,項目對象模型),定義了項目的基本信息,用于描述項目如何構建,聲明項目依賴,等等。

在Eclipse中新建一個Maven Project,生成的pom.xml文件如下:

pom.xml

其中groupId,artifactId,version是最重要的,這三個元素定義了一個項目基本的坐標。在Maven的世界,任何的jar,pom或者war都是以基于這些基本的坐標進行區分的。

*groupId ?-- 定義了項目屬于哪個組,這個組往往和項目所在的組織或公司存在關聯。比如說,你在github上建立了一個名為myapp的項目,那么groupId就應該是com.github.myapp,如果你的公司是athrob,有一個項目為cloud,那么groupId就應該是com.athrob.cloud。

*artifactId? -- 定義了當前maven項目在組中唯一的ID。一般使用"項目名-模塊名"來命名。

*version ?-- 指定了當前maven項目的版本。SNAPSHOT意為快照,說明該項目還處于開發中,是不穩定的版本。隨著項目的發展,version會不斷更新,如,升級成1.0,2.0-SNAPSHOT,2.0等。{ 注:一般第一個0表示大版本號,第二個0表示分支版本號,第三個0表示小版本號,例:0.0.1,snapshot, -- 快照;alpha, -- 內部測試;beta, -- 公測;release, -- 穩定版GA(General Availability) -- 正式發布的版本 }

其他標簽:

*name ?-- 項目描述名,聲明了一個對于用戶更為友好的項目名稱。雖然這不是必須的,但是推薦為每個pom聲明name,以方便信息交流。

*package? -- 默認是jar

*description? -- 項目描述

*dependency,exclusions,build,plugin,parent,module等見下圖所示:

dependency,exclusions,build,plugin,parent,module

關于依賴,后面我們會具體說一下依賴依賴的沖突。以及maven的聚合繼承


0x03 ?Maven生命周期(clean,default,site)

clean -- 清理項目

default -- 構件項目

site -- 生成項目站點


*clean: 三個階段

pre-clean -- 執行清理前的工作

clean -- 清理上一次構建生成的所有文件

post-clean -- 執行清理后的文件


*default: (最核心)

主要有這幾個階段:compile,test,package,install


*site:

pre-site -- 在生成項目站點前要完成的工作

site -- 生成項目的站點文檔

post-site -- 在生成項目站點后要完成的工作

site-deploy -- 發布生成的站點到服務器上


0x04 ?Maven倉庫

有本地倉庫,遠程倉庫,鏡像倉庫。

接下來說一下如何修改他們。


本地倉庫默認是在~/.m2目錄下。{ ~ 表示用戶所在的家目錄,例:C:\Users\admin\.m2 }

修改maven的conf目錄下的settings.xml文件,使用localRepository標簽,添加本地倉庫的目錄,如下圖:

local_repo

這樣,我們就把Maven的本地倉庫設置為:D:/maven_repo

然后復制settings.xml文件到我們設置的本地倉庫目錄下。


遠程倉庫可以理解為Maven的中央倉庫:https://repo.maven.apache.org/maven2

通過打開lib目錄下的maven-model-builder-3.3.9.jar包,依次進入org\apache\maven\model,查看pom-4.0.0.xml文件,就可以看到中央倉庫的url了。


鏡像倉庫:

依然是剛才提到的settings.xml,修改其中mirrors,mirror標簽里的內容,就可以修改maven的鏡像倉庫,這里我修改為OSChina的,如下圖:

OSChina mirror

0x05 ?關于Maven項目

*Maven項目主代碼和測試代碼:

默認情況下,項目主代碼位于src/main/java目錄,測試代碼位于src/test/java目錄。


*自動創建符合maven規范目錄的兩種方式:

mvn archetype:generate ? ? [注:按照提示進行選擇]

mvn archetype:generate -DgroupId=組織名、公司網址的反寫 + 項目名?-DartifactId=項目名-模塊名?-Dversion=版本?-Dpackage=代碼所在的包名


*常用的maven命令:

mvn -v ? -- ?查看maven版本

mvn compile ? -- ?編譯

mvn test ? -- ?測試

mvn package ? -- ?打包

mvn clean ? -- ?刪除target

mvn install ? -- ?安裝jar包到本地倉庫中

也可以組合起來用,如:mvn clean package

好,接下來,說一說maven中另外一個比較重要的概念:依賴


0x06 ?依賴

前面也提到過,在pom.xml文件中使用dependencies和dependency標簽,來聲明依賴。

首先說一下依賴的范圍:(使用scope標簽聲明依賴的范圍)

compile -- 默認的范圍,編譯測試運行都有效

provided -- 在編譯和測試時有效

runtime -- 在測試和運行時有效?

test -- 只在測試時有效

system -- 與本機系統相關聯,移植性差

import -- 導入的范圍,它只使用在dependencyManagement中,表示從其他的pom中導入dependency的配置


接下來用具體的例子來說明依賴,依賴的傳遞以及排除依賴傳遞,如下圖所示:

A,B,C分別為三個maven項目。

B依賴A
C也依賴了A

使用exclusions,exclusion標簽來聲明排除依賴傳遞

C依賴B,不依賴A

接下來,說一下關于依賴的沖突。(即聲明了相同的構件,不同的版本)

兩條原則:

1.短路優先

A -> B -> C -> X(jar)

A -> D -> X(jar)

會優先解析路徑短的版本

2.先聲明,先優先

如果路徑長度相同,則誰先聲明,先解析誰


依然以圖示例,這樣會更好理解一些,如下圖所示:

A,B,C為三個Maven項目

1. 短路優先

A-commons-io-2.4
B-commons-io-2.0
C-commons-io-2.0

2. 先聲明,先優先

C-A-commons-io-2.4
C-B-commmons-io-2.0

0x07 ?聚合和繼承

*聚合

我對聚合的理解就是一個maven項目能夠直接對其他所有模塊項目進行管理和構建。

如下圖所示:

A,B,C為三個maven模塊項目,新建一個all項目,通過modules,module標簽聲明聚合。

build-all-juhe

通過對all這個項目的maven build...就實現對其他三個項目的構建。查看控制臺信息,如下:

A-B-C-build-success

這樣就不用對每個模塊逐個進行構建。可以看到A,B,C均構建成功。

build-A-jar
build-B-jar
build-C-jar

*繼承

跟java中繼承的概念很相似,還是以圖示例,見下圖:

可以看到,A沒有依賴,parent依賴junit-3.8.1.jar。

A-no-yilai

在A的pom.xml中使用parent標簽表現來聲明繼承parent,如下圖:

A-jicheng-parent

可以看到,此時A就繼承了parent對junit-3.8.1.jar的依賴。


0x08 ?使用Eclipse新建一個Maven Project之webapp

首先要安裝m2eclipse插件:

在Eclipse IDE中,Help -> Install New Software... -> Add

Name: m2e

Location: http://m2eclipse.sonatype.org/sites/m2e

注:不要使用IDE內嵌的MAVEN插件

Windows -> Perferences -> Maven -> Installations? 【取消使用IDE內嵌的Maven插件,選擇Add添加Maven的安裝目錄】

然后更改Maven的User Settings。這里選擇本地倉庫的settings.xml文件。

maven-user-settings

然后我們開始新建一個Maven Project

new-other
new-maven-project
use-default-workspace

Select an Archetype這一步,選擇webapp

select-an-archetype

填寫groupId,artifactId,version,package等信息。

specify-archetype-param

等個一兩分鐘,項目就創建好了,但是會報一個jsp error的錯誤。這是因為,缺少了一個類。

jsp-error

解決辦法如下圖,添加Java Servlet API的依賴就好了:

jsp-error-solution

此時,就OK了。剩下的可以自由發揮了。


0x09 ?其他

上面我們創建好的Maven Project,發現沒有src/main/java和src/test/java文件夾,只有一個src/main/resource文件夾。

我們更改一下項目的JRE System Library就好了。

add-JRE-System-Library
workspace default JRE
add JRE System Library
remove JRE1.5
main test folder appear

可以看到,此時就有src/main/java和src/test/java兩個文件夾了。


使用jetty插件

jetty-plugin
run as maven build...
jetty-run
started-jetty-server

訪問http://localhost:8080

localhost-8080

使用tomcat插件

tomcat-plugin

上面這里部署了在package階段運行。

tomcat-clean-package
tomcat-run

訪問http://localhost:8080/webdemo

localhost-8080-webdemo

完!


不足之處,請批評指正。

如有問題,請私信聯系。

謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容