目錄
一、什么是Maven
Maven的作用
Maven模型
Maven倉庫
二、下載及安裝
三、IDEA集成Maven
1、POM配置詳解
2、配置Maven環境
局部配置
全局設置
四、創建Maven項目
五、Maven坐標詳解
六、導入Maven項目
方式1:使用Maven面板,快速導入項目
方式2:使用idea導入模塊項目
七、依賴管理
添加依賴的方式:
1.利用中央倉庫搜索的依賴坐標
2.利用IDEA工具搜索依賴
依賴傳遞
排除依賴
依賴范圍
八、生命周期
九、附錄
更新依賴索引
清理maven倉庫
一、什么是Maven
Maven是Apache旗下的一個開源項目,是一款用于管理和構建java項目的工具。
?Apache 軟件基金會,成立于1999年7月,是目前世界上最大的最受歡迎的開源軟件基金會,也是一個專門為支持開源項目而生的非盈利性組織。
開源項目:Welcome to The Apache Software Foundation!
它基于項目對象模型 (Project Object Model , 簡稱: POM) 的概念。
?官網:https://maven.apache.org/
Maven的作用
-
依賴(jar包)管理
-
統一項目結構
-
項目構建
Maven模型
-
項目對象模型 (Project Object Model)
-
依賴管理模型(Dependency)
-
構建生命周期/階段(Build lifecycle & phases)
-
- 構建生命周期/階段(Build lifecycle & phases)
上圖中紫色框起來的部分,就是用來完成標準化構建流程 。當我們需要編譯,Maven提供了一個編譯插件供我們使用;當我們需要打包,Maven就提供了一個打包插件供我們使用等。
通過插件就可以完成maven標準化構建,在執行這些操作的時候,不同的階段,就會有不同的文件產生,比如:編譯階段就會有編譯之后的字節碼文件產生、打包階段就有打包之后的jar文件產生,這些文件都被放在target目錄下。 - 項目對象模型 (Project Object Model)
將我們自己的項目抽象成一個對象模型,有自己專屬的坐標。
(坐標,就是資源(jar包)的唯一標識,通過坐標可以定位到所需資源(jar包)位置 )
POM是指,在maven項目中,可以通過pom.xml當中配置的一小段描述Maven工程。(通過maven坐標可以唯一標識定位一個項目)。如下圖所示是一個Maven項目: - 依賴管理模型(Dependency)
如果當前maven項目中還需要依賴其他的資源,就可以在pom.xml中添加依賴管理模型(Dependency),在dependency標簽中添加需要添加的依賴的坐標,當我們添加依賴的坐標之后,maven就能自動從倉庫中去查找這個依賴。
Maven倉庫
倉庫:用于存儲資源,管理各種jar包
倉庫的本質就是一個目錄(文件夾),這個目錄被用來存儲開發中所有依賴(就是jar包)和插件
Maven倉庫分為:
-
本地倉庫:自己計算機上的一個目錄(用來存儲jar包)
-
中央倉庫:由Maven團隊維護的全球唯一的。倉庫地址:Central Repository:
-
遠程倉庫(私服):一般由公司團隊搭建的私有倉庫
當項目中使用坐標引入對應依賴jar包后,首先會查找本地倉庫中是否有對應的jar包
-
如果有,則在項目直接引用
-
如果沒有,則去中央倉庫中下載對應的jar包到本地倉庫
由于中央倉庫是全球唯一的,本地倉庫連接中央倉庫是要連接國外的網站的,這個過程是比較慢的,但為了提高下載jar包的速度,我們可以引入遠程倉庫(私服),這個私服一般是公司團隊自己搭建的。
如果還可以搭建遠程倉庫(私服),將來jar包的查找順序則變為: 本地倉庫 --> 遠程倉庫(私服)--> 中央倉庫,如果本地倉庫和私服都沒有,它會先從中央倉庫下載到私服,然后再下載到本地倉庫。
二、下載及安裝
下載地址:https://maven.apache.org/download.cgi
Maven安裝配置步驟:
-
解壓安裝
-
配置倉庫
-
配置Maven環境變量(即可以在任意目錄下執行maven的指令)
1、解壓 apache-maven-3.6.1-bin.zip(解壓即安裝)
建議解壓到沒有中文、特殊字符的路徑下。
點開之后,發現還有一級目錄,此時我們可以直接將它解壓,不需要再新建文件夾
解壓縮后的目錄結構如下:
-
bin目錄 : 存放的是可執行命令。(mvn 命令重點關注)
-
conf目錄 :存放Maven的配置文件。(settings.xml配置文件后期需要修改)
-
lib目錄 :存放Maven依賴的jar包。(Maven也是使用java開發的,所以它也依賴其他的jar包)
2、配置本地倉庫
在自己計算機上新一個目錄(本地倉庫,用來存儲jar包)
進入到conf目錄下修改 settings.xml 配置文件
1). 使用記事本軟件,打開settings.xml文件,定位到53行
2). 復制<localRepository>標簽,粘貼到注釋的外面(55行)
3). 復制之前新建的用來存儲jar包的路徑,替換掉<localRepository>標簽體內容
3、配置阿里云私服
由于中央倉庫在國外,所以下載jar包速度可能比較慢,而阿里公司提供了一個遠程倉庫,里面基本也都有開源項目的jar包。
進入到conf目錄下修改settings.xml配置文件:
1). 使用超級記事本軟件,打開settings.xml文件,定位到160行左右
2). 在<mirrors>標簽下為其添加子標簽<mirror>,內容如下:
<mirror> ?<id>alimaven</id> ?<name>aliyun maven</name> ?<url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf> ? ? ? ? ?
</mirror>
注意配置的位置,在<mirrors> ... </mirrors> 中間添加配置。如下圖所示:
注: 只可配置一個<mirror>(另一個要注釋!) ,不然兩個可能發生沖突,導致jar包無法下載!!!!
4、配置環境變量
Maven環境變量的配置類似于JDK環境變量配置一樣
1). 在系統變量處新建一個變量MAVEN_HOME
-
MAVEN_HOME環境變量的值,設置為maven的解壓安裝目錄
2). 在Path中進行配置
-
PATH環境變量的值,設置為:%MAVEN_HOME%\bin
3). 打開DOS命令提示符進行驗證,出現如圖所示表示安裝成功
mvn -v
MAVEN想要成功的運行,它是基于JDK環境的
三、IDEA集成Maven
1、POM配置詳解
POM (Project Object Model) :指的是項目對象模型,用來描述當前的maven項目。
-
使用pom.xml文件來實現
pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<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"><!-- POM模型版本 --><modelVersion>4.0.0</modelVersion>
?<!-- 當前項目坐標 --><groupId>com.itheima</groupId><artifactId>maven_project1</artifactId><version>1.0-SNAPSHOT</version><!-- 打包方式 --><packaging>jar</packaging></project>
-
<project> :文檔聲明,pom文件的根標簽,表示當前maven項目
-
<modelVersion> :聲明項目描述遵循哪一個POM模型版本
-
雖然模型本身的版本很少改變,但它仍然是必不可少的。目前POM模型版本是4.0.0
-
-
坐標 :<groupId>、<artifactId>、<version>
-
定位項目在本地倉庫中的位置,由以上三個標簽組成一個坐標
-
-
<packaging> :maven項目的打包方式,通常設置為jar或war(默認值:jar)
我們要想在IDEA中使用Maven進行項目構建,就需要在IDEA中集成Maven
2、配置Maven環境
局部配置
1、選擇 IDEA中 File => Settings => Build,Execution,Deployment => Build Tools => Maven
2、設置IDEA使用本地安裝的Maven,并修改配置文件及本地倉庫路徑
?
Maven home path :指定當前Maven的安裝目錄
User settings file :指定當前Maven的settings.xml配置文件的存放路徑
Local repository :指定Maven的本地倉庫的路徑 (如果指定了settings.xml, 這個目錄會自動讀取出來, 可以不用手動指定)
3、配置工程的編譯版本為11
由于我目前使用的是JAVA11的版本,所以配置的是11,如果不是該版本的JDK,將數字都改為自己JDK版本的數字即可。
-
Maven默認使用的編譯版本為5(版本過低)
4、配置java字節碼文件版本號
java字節碼文件的版本號和jdk的版本相對應
全局設置
上述配置的maven環境,只是針對于當前工程的,如果我們再創建一個project,又恢復成默認的配置了。 要解決這個問題, 我們就需要配置全局的maven環境。
1、進入到IDEA歡迎頁面
-
選擇 IDEA中 File => close project
2、打開 All settings , 選擇 Build,Execution,Deployment => Build Tools => Maven
3、配置工程的編譯版本為11
這里所設置的maven的環境信息,并未指定任何一個project,此時設置的信息就屬于全局配置信息。 以后,我們再創建project,默認就是使用我們全局配置的信息。
四、創建Maven項目
1、創建一個空項目
2、文件 => 項目結構 => 創建模塊,選擇Maven,點擊Next
3、填寫模塊名稱,坐標信息,點擊finish,創建完成
4、在Maven工程下,創建HelloWorld類
Maven項目的目錄結構:
maven-project01
????????|--- src (源代碼目錄和測試代碼目錄)
????????????????|--- main (源代碼目錄)
????????????????????????|--- java (源代碼java文件目錄)
????????????????????????|--- resources (源代碼配置文件目錄)
????????|--- test (測試代碼目錄)
????????????????|--- java (測試代碼java目錄)
????????????????|--- resources (測試代碼配置文件目錄)
????????|--- target (編譯、打包生成文件存放目錄但由于test下的resource不常用,所以創建maven的時候它并沒有給我們創建出來,如果我們需要可以new一個directory,此時它會自動聯想出來
5、編寫 HelloWorld,并運行
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello Maven ...");}
}
五、Maven坐標詳解
什么是坐標?
-
Maven中的坐標是 資源的唯一標識 , 通過該坐標可以唯一定位資源位置
-
使用坐標來定義項目或引入項目中需要的依賴
Maven坐標主要組成
-
groupId:定義當前Maven項目隸屬組織名稱
通常是公司或組織域名的倒序,例如:com.itheima,通常也會加上項目名稱(因為一個項目可能有很多工程) -
artifactId:定義當前Maven項目名稱(通常是模塊名稱,例如 order-service、goods-service)
-
version:定義當前項目版本號
例如:SNAPSHOT 表示快照版本,正在迭代過程中,不穩定的版本
例如:RELEASE 表示正式版本
如下就是使用坐標表示一個項目:
<groupId>com.itheima</groupId>
<artifactId>maven-project01</artifactId>
<version>1.0-SNAPSHOT</version>
注意:
上面所說的資源可以是插件、依賴、當前項目。
我們的項目如果被其他的項目依賴時,也是需要坐標來引入的。
六、導入Maven項目
方式1:使用Maven面板,快速導入項目
打開IDEA,選擇右側Maven面板,點擊 + 號,選中對應項目的pom.xml文件,雙擊即可
說明:如果沒有Maven面板,選擇 View => Appearance => Tool Window Bars
刪除maven工程:直接右擊刪除,但是它并不會將磁盤中的maven工程刪除,如果需要刪除磁盤中的maven工程,則需要去資源管理器中刪除它的文件
方式2:使用idea導入模塊項目
File => Project Structure => Modules => + => Import Module
找到要導入工程的pom.xml
七、依賴管理
依賴:指當前項目運行所需要的jar包。一個項目中可以引入多個依賴:
例如:在當前工程中,我們需要用到logback來記錄日志,此時就可以在maven工程的pom.xml文件中,引入logback的依賴。具體步驟如下:
-
在pom.xml中編寫<dependencies>標簽
-
在<dependencies>標簽中使用<dependency>引入坐標
-
定義坐標的 groupId、artifactId、version
<dependencies><!-- 第1個依賴 : logback --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version></dependency><!-- 第2個依賴 : junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency> </dependencies>
-
點擊刷新按鈕,引入最新加入的坐標
刷新依賴:保證每一次引入新的依賴,或者修改現有的依賴配置,都可以加入最新的坐標
注意事項:
第一次使用這個依賴是沒有提示的
如果引入的依賴,在本地倉庫中不存在,將會連接遠程倉庫 / 中央倉庫,然后下載依賴(這個過程會比較耗時,耐心等待)
如果不知道依賴的坐標信息,可以到mvn的中央倉庫(https://mvnrepository.com/)中搜索
添加依賴的方式:
1.利用中央倉庫搜索的依賴坐標
一般會參考Usages這個指標去選定版本
2.利用IDEA工具搜索依賴
熟練上手maven后,快速導入依賴
依賴傳遞
依賴具有傳遞性
早期我們沒有使用maven時,向項目中添加依賴的jar包,需要把所有的jar包都復制到項目工程下。如下圖所示,需要logback-classic時,由于logback-classic又依賴了logback-core和slf4j,所以必須把這3個jar包全部復制到項目工程下
我們現在使用了maven,當項目中需要使用logback-classic時,只需要在pom.xml配置文件中,添加logback-classic的依賴坐標即可。
在pom.xml文件中只添加了logback-classic依賴,但由于maven的依賴具有傳遞性,所以會自動把所依賴的其他jar包也一起導入。
依賴傳遞可以分為:
-
直接依賴:在當前項目中通過依賴配置建立的依賴關系
-
間接依賴:被依賴的資源如果依賴其他資源,當前項目間接依賴其他資源
比如以上圖中:
-
projectA依賴了projectB。對于projectA 來說,projectB 就是直接依賴。
-
而projectB依賴了projectC及其他jar包。 那么此時,在projectA中也會將projectC的依賴傳遞下來。對于projectA 來說,projectC就是間接依賴。
在IDEA中,它還給我們提供了一種可視化的方式:
首先打開想要查看依賴情況的項目的pom文件:
排除依賴
問題:之前我們講了依賴具有傳遞性。那么A依賴B,B依賴C,如果A不想將C依賴進來,是否可以做到?
答案:在maven項目中,我們可以通過排除依賴來實現。
排除依賴:指主動斷開依賴的資源。(被排除的資源無需指定版本)
<dependency><groupId>com.itheima</groupId><artifactId>maven-projectB</artifactId><version>1.0-SNAPSHOT</version><!--排除依賴, 主動斷開依賴的資源--><exclusions><exclusion><groupId>junit</groupId><artifactId>junit</artifactId></exclusion></exclusions>
</dependency>
依賴排除示例:
-
maven-projectA依賴了maven-projectB,maven-projectB依賴了Junit。基于依賴的傳遞性,所以maven-projectA也依賴了Junit
-
使用排除依賴后
依賴范圍
在項目中導入依賴的jar包后,默認情況下,可以在任何地方使用。
如果希望限制依賴的使用范圍,可以通過<scope>標簽設置其作用范圍。
作用范圍:
-
主程序范圍有效(main文件夾范圍內)
-
測試程序范圍有效(test文件夾范圍內)
-
是否參與打包運行(package指令范圍內)
如上圖所示,給junit依賴通過scope標簽指定依賴的作用范圍。 那么這個依賴就只能作用在測試環境,其他環境下不能使用。
scope標簽的取值范圍:
scope值 | 主程序 | 測試程序 | 打包(運行) | 范例 |
---|---|---|---|---|
compile(默認) | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc驅動 |
測試log4j是否參與項目打包,需要注意:
maven中默認提供的打包插件,只能將當前項目的資源打包進去,它所依賴的jar包并不會打包進去
如果需要將依賴的jar包也打包進去,則需要配置打包插件,后面學習web開發的時候有更便捷的方式!
八、生命周期
介紹
Maven的生命周期就是為了對所有的構建過程進行抽象和統一。 描述了一次項目構建,經歷哪些階段。
在Maven出現之前,項目構建的生命周期就已經存在,軟件開發人員每天都在對項目進行清理,編譯,測試及部署。雖然大家都在不停地做構建工作,但公司和公司間、項目和項目間,往往使用不同的方式做類似的工作。
Maven從大量項目和構建工具中學習和反思,然后總結了一套高度完美的,易擴展的項目構建生命周期。這個生命周期包含了項目的清理,初始化,編譯,測試,打包,集成測試,驗證,部署和站點生成等幾乎所有構建步驟。
Maven對項目構建的生命周期劃分為3套(相互獨立):
-
clean:清理工作。(主要用來清理上一次項目構建所產生的一些文件,比如編譯之后的class文件、字節碼文件等)
-
default:核心工作。如:編譯、測試、打包、安裝、部署等。
-
site:生成報告、發布站點等。
三套生命周期又包含哪些具體的階段呢, 我們來看下面這幅圖:
每套生命周期包含一些階段(phase),階段是有順序的,后面的階段依賴于前面的階段。
我們看到這三套生命周期,里面有很多很多的階段,這么多生命周期階段,其實我們常用的并不多,主要關注以下幾個:
? clean:移除上一次構建生成的文件
? compile:編譯項目源代碼
? test:使用合適的單元測試框架運行測試(junit)
? package:將編譯后的文件打包,如:jar、war等
? install:安裝項目到本地倉庫
IDEA工具為了方便程序員使用maven生命周期,在右側的maven工具欄中,已給出快速訪問通道
生命周期的順序是:clean --> validate --> compile --> test --> package --> verify --> install --> site --> deploy
我們需要關注的就是:clean --> compile --> test --> package --> install
說明:在同一套生命周期中,我們在執行后面的生命周期時,前面的生命周期都會執行。
思考:當運行package生命周期時,clean、compile生命周期會不會運行?
clean不會運行,compile會運行。 因為compile與package屬于同一套生命周期,而clean與package不屬于同一套生命周期。
執行
在日常開發中,當我們要執行指定的生命周期時,有兩種執行方式:
-
在idea工具右側的maven工具欄中,選擇對應的生命周期,雙擊執行
-
在DOS命令行中,通過maven命令執行
方式一:在idea中執行生命周期
-
選擇對應的生命周期,雙擊執行
compile:
會將編譯好的存放在target下,classes里面存放的就是編譯之后的字節碼文件
test:
package:
打包后的文件會存放在target這個目錄下
install:
將當前的項目打包放在本地倉庫
跳過測試階段:
clean:
方式二:在命令行中執行生命周期
進入到DOS命令行
Maven的生命周期是抽象的,這意味著生命周期本身不做任何實際工作。在Maven的設計中,實際任務(如源代碼編譯)都交由插件來完成。
九、附錄
更新依賴索引
有時候給idea配置完maven倉庫信息后,在idea中依然搜索不到倉庫中的jar包。這是因為倉庫中的jar包索引尚未更新到idea中。這個時候我們就需要更新idea中maven的索引了,具體做法如下:
打開設置----搜索maven----Repositories----選中本地倉庫-----點擊Update
清理maven倉庫
初始情況下,我們的本地倉庫是沒有任何jar包的,此時會從私服去下載(如果沒有配置,就直接從中央倉庫去下載),可能由于網絡的原因,jar包下載不完全,這些不完整的jar包都是以lastUpdated結尾。此時,maven不會再重新幫你下載,需要你刪除這些以lastUpdated結尾的文件,然后maven才會再次自動下載這些jar包。
如果本地倉庫中有很多這樣的以lastUpadted結尾的文件,可以定義一個批處理文件,在其中編寫如下腳本來刪除:
set REPOSITORY_PATH=E:\develop\apache-maven-3.6.1\mvn_repo
rem 正在搜索...
?
del /s /q %REPOSITORY_PATH%\*.lastUpdated
?
rem 搜索完畢
pause
操作步驟如下:
1). 定義批處理文件del_lastUpdated.bat (直接創建一個文本文件,命名為del_lastUpdated,后綴名直接改為bat即可 )
2). 在上面的bat文件上右鍵---》編輯 。修改文件:
修改完畢后,雙擊運行即可刪除maven倉庫中的殘留文