文章目錄
- 1. Maven概述
- 2. Maven的下載與安裝
- 2.1 下載
- 2.2 安裝
- 3. Maven倉庫配置
- 3.1 修改本地倉庫配置
- 3.2 修改遠程倉庫配置
- 3.3 修改后的settings.xml
- 4. 使用Maven創建項目
- 4.1 手工創建Java項目
- 4.2 原型創建Java項目
- 4.3 原型創建Web項目
- 5. Tomcat啟動Web項目
- 5.1 使用Tomcat插件啟動項目
- 5.2 本地安裝Tomcat啟動項目
- 5.2.1 下載并安裝Tomcat
- 5.2.2 本地Tomcat啟動項目
- 6. Maven的依賴管理
- 6.1 依賴配置
- 6.2 依賴傳遞
- 6.2.1 依賴傳遞演示
- 6.2.2 依賴傳遞沖突
- 6.3 可選依賴
- 6.4 排除依賴
- 6.5 依賴范圍
- 7. 生命周期與插件
- 7.1 構建生命周期
- 7.2 插件
1. Maven概述
1.Maven簡介:maven
是一個項目管理工具,將項目開發和管理過程抽象成一個項目對象模型(POM
)。
注:
POM(Project Object Model)
:項目對象模型
maven管理項目流程如下:
2.Maven的作用
- 項目構建:提供標準的、跨平臺的自動化項目構建方式
- 依賴管理:方便快捷的管理項目依賴的資源(jar包),避免資源間的版本沖突問題
- 統一開發結構:提供標準的、統一的項目結構
3.Maven倉庫
- 倉庫:用于存儲資源, 包含各種jar包
- 倉庫分類:
- 本地倉庫:自己電腦上存儲資源的倉庫,連接遠程倉庫獲取資源
- 遠程倉庫:非本機電腦上的倉庫,為本地倉庫提供資源
- 中央倉庫:Maven團隊維護, 存儲所有資源的倉庫
- 私服:部門/公司范圍內存儲資源的倉庫,從中央倉庫獲取資源
- 私服的作用:
- 保存具有版權的資源, 包含購買或自主研發的jar(中央倉庫中的jar都是開源的, 不能存儲具有版權的資源)
- 一定范圍內共享資源,僅對內部開放,不對外共享
4.Maven坐標
- 坐標概念:Maven中的坐標用于描述倉庫中資源的位置
- 坐標的主要組成
groupId
:組織id,定義當前Maven項目隸屬組織名稱(通常是域名反寫, 例如:org.mybatis)artifactld
:項目id,定義當前Maven項目名稱(通常是模塊名稱, 例如CRM、SMS)version
:版本號,定義當前項目版本號
- 坐標的作用:使用唯一標識,唯一性定位資源位置,通過該標識可以將資源的識別與下載工作交由機器完成
2. Maven的下載與安裝
2.1 下載
官網下載:
- 最新版本:https://maven.apache.org/download.cgi
- 歷史版本:https://archive.apache.org/dist/maven/maven-3/
最新版本:
歷史版本:
2.2 安裝
此處下載得到最新的 apache-maven-3.9.3-bin.zip
安裝包,放在任意一個文件夾下,右鍵解壓到當前文件夾。
此處我解壓到 E:\Applications\apache-maven-3.9.3
配置環境變量:
1.新建 MAVEN_HOME
環境變量,變量值為maven安裝路徑
- 變量名:
MAVEN_HOME
- 變量值:
E:\Applications\apache-maven-3.9.3
2.修改 Path
變量
在 系統變量 中選中 Path 變量后,點擊 “編輯” 按鈕,隨后點擊“新建”,輸入 %MAVEN_HOME%\bin
即可
3.輸入命令,測試是否安裝成功
mvn -v
出現以下界面,表示安裝成功:
3. Maven倉庫配置
3.1 修改本地倉庫配置
本地倉庫:maven啟動后,會自動保存下載的資源到本地倉庫
- 默認位置:登錄用戶名所在目錄的
.m2
文件夾中,如C:\Users\Admin\.m2\repository
(默認保存到C盤)
<localRepository>${user.name}\.m2\repository</localRepository>
- 自定義位置:修改本地倉庫位置為指定路徑,如
D:\repository
<localRepository>D:\repository</localRepository>
由于默認保存到C盤,所以要修改本地倉庫配置,步驟如下:
1.找到安裝包的conf
文件夾下的settings.xml
文件,使用 vscode
或者其他工具打開它
2.Ctrl+F
搜索 localRepository
,復制剛剛的自定義配置到這里即可
3.2 修改遠程倉庫配置
遠程倉庫:為本地倉庫提供資源的倉庫,資源從遠程倉庫下載到本地倉庫。
1.默認遠程倉庫:
<repositories><repository><id>central</id><name>Central Repository</name><url>https://repo.maven.apache.org/maven2</url><layout>default</layout><snapshots><enabled>false</enabled></snapshots></repository>
</repositories>
2.鏡像遠程倉庫:
鏡像倉庫配置:
id
:鏡像的唯一標識,用來區分不同的mirror
元素mirrorOf
:對哪個倉庫進行鏡像,簡單來說就是替代哪個倉庫,此處填為central
,也就是替代了默認遠程倉庫name
:鏡像名稱url
:鏡像URL
修改鏡像倉庫地址:修改鏡像倉庫地址是為了加快下載速度,此處修改為阿里云鏡像,遠程倉庫的地址從國外轉到了國內,下載速度自然就快了
<mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>
</mirrors>
依然還是修改E:\Applications\apache-maven-3.9.3\conf
文件夾下的settings.xml
文件:
3.3 修改后的settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd"><localRepository>D:\repository</localRepository><mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror></mirrors>
</settings>
4. 使用Maven創建項目
Maven工程的目錄結構如下:左邊是Java項目,右邊是Web項目。
可以發現Web項目就是比Java項目多了個webapp目錄
4.1 手工創建Java項目
由于 Idea 創建的maven一開始是沒有 settings.xml
的,所以每次創建新 maven
工程的時候,會使用默認的 settings.xml
配置,也就是使用默認的本地倉庫地址和遠程倉庫地地址。
- 默認本地倉庫地址:
${user.name}\.m2\repository
- 默認遠程倉庫地址:
https://repo.maven.apache.org/maven2
前置工作:將上述修改好的 apache-maven-3.9.3\conf\settings.xml
文件,復制到${user.name}\.m2\repository
文件夾下,則每次創建新 maven項目,會默認使用該配置,可以解決剛啟動項目時,下載jar包速度慢的問題。
1.New Project,創建新項目
2.填寫項目名稱等信息,Build System勾選Maven
手工創建Java項目,得到的Maven工程結構如下:
3.修改項目的maven配置,打開 Settings
并在搜索框輸入maven
,修改以下內容即可
注:每次創建或導入一個maven項目的時候,maven配置都會使用默認配置,因此每次都需要重新修改它的maven配置
4.2 原型創建Java項目
ArcheType
選擇org.apache.maven.archetypes:maven-archetype-quickstart
,就能使用原型創建Java
工程項目
注:使用原型創建maven項目的方式,會下載一些jar包,所以項目構建需要等待一段時間。
使用原型創建Java項目,得到的Maven工程結構如下:
4.3 原型創建Web項目
ArcheType
:選擇org.apache.maven.archetypes:maven-archetype-webapp
,就能使用原型創建 Web
工程項目
注:使用原型創建maven項目的方式,會下載一些jar包,所以項目構建需要等待一段時間。
使用原型創建Web項目,得到的Maven工程結構如下:
以該Web項目為例,由于其結構缺失,需要手動補充文件夾,使其稱為完整的Web項目工程:
- main目錄下新建java目錄,并將其標記為
Sources Root
- src目錄下新建test目錄,并在test目錄下新建java和resources
- 標記test目錄下的java為
Test Sources Root
,resources為Test Resources Root
最終Web項目結構如下:
5. Tomcat啟動Web項目
5.1 使用Tomcat插件啟動項目
mvnrepository
官網地址:https://mvnrepository.com/
1.搜索框中輸入tomcat maven
,點擊Search
進行搜索,找到 Apache Tomcat Maven Plugin :: Common API
,然后點擊org.apache.tomcat.maven
鏈接進入
注意:是點擊
org.apache.tomcat.maven
藍色鏈接,而不是點擊Apache Tomcat Maven Plugin :: Common API
黑體字,點擊黑體字進去的鏈接是找不到 tomcat 插件的
2.Apache Tomcat Maven Plugin :: Tomcat 7.x
,點擊鏈接進入,繼續選擇一個版本點擊進入
3.得到了Tomcat7插件的 groupId、artifactId、version
,并復制到pom.xml
中,就完成了插件的安裝
4.最終得到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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>maven-project</artifactId><packaging>war</packaging> <!--打包方式為war包--><version>1.0-SNAPSHOT</version><name>maven-project Maven Webapp</name><url>http://maven.apache.org</url><!--構建項目需要的信息--><build><!--插件列表--><plugins><!--安裝tomcat7插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin></plugins></build></project>
5.打開maven側邊欄,找到tomcat7插件,點擊tomcat7:run
,啟動tomcat服務器
6.運行后會在末尾出顯示一個鏈接,就是本地項目的地址,點擊該鏈接即可查看web項目。
點擊 http://localhost:8080/maven-project
,彈出頁面如下:
之所以頁面會顯示Hello World!
,是因為使用原型創建web項目時,自動創建了一個index.jsp
,內容如下:
注:如果不想使用默認的
8080
端口和默認路徑,可以進行以下配置修改
<!--構建項目需要的信息-->
<build><!--插件列表--><plugins><!--安裝tomcat7插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><!--配置端口號和路徑--><configuration><port>80</port><path>/</path></configuration></plugin></plugins>
</build>
再次啟動 tomcat,訪問以下地址即可:http://localhost:80/
另外,還可以進行如下配置操作,用于簡化tomcat服務器的啟動:
idea右上角,Current File
下拉框選擇 Edit Configurations
點擊 +
號,選擇 Maven
填寫配置名稱、命令行以及選擇應用到哪個工程
以后就可以使用如下方式啟動tomcat服務器了
5.2 本地安裝Tomcat啟動項目
5.2.1 下載并安裝Tomcat
1.下載 tomcat,此處以tomcat9
為例
官網地址:https://tomcat.apache.org/
點擊左邊欄Download
下的Tomcat9
點擊 64-bit Windows zip (pgp, sha512)
鏈接進行下載,得到apache-tomcat-9.0.78-windows-x64.zip
壓縮包
2.安裝 tomcat,把壓縮包放到任意一個文件夾下解壓,選擇解壓到當前文件夾,即可安裝成功
此處我解壓到 E:\Applications\apache-tomcat-9.0.78
3.配置tomcat環境變量
新建一個變量如下:
- 變量名:
CATALINA_HOME
- 變量值:
E:\Applications\apache-tomcat-9.0.78
修改path變量,新增 %CATALINA_HOME%\bin
4.驗證是否配置成功:打開cmd,輸入 startup.bat
回車
注:執行這步之前,先檢查其他地方是否關閉了tomcat,否則會出現端口號(8080)占用的情況,導致啟動失敗(如檢查Idea中是否停止運行了tomcat插件)
啟動完成后,打開瀏覽器輸入 http://localhost:8080
,出現如圖所示,說明安裝配置成功了
注:上述運行
startup.bat
腳本時,出現的亂碼問題,可以通過修改apache-tomcat-9.0.78\conf\logging.properties
解決
打開logging.properties
文件,搜索 java.util.logging.ConsoleHandler.encoding = UTF-8
,把 UTF-8
改為GBK
即可:
java.util.logging.ConsoleHandler.encoding = GBK
此時再重啟 startup.bat
腳本,就沒有了亂碼問題:
5.2.2 本地Tomcat啟動項目
本地tomcat安裝配置完成后,再進行以下三步即可啟動web項目:
- 打包war包
- 把war包放到 webapps 目錄下
- 啟動 startup.bat 腳本
1.打包war包:打開maven側邊欄,找到 Lifecycle
,并點擊 package
,等待構建完成會在target
文件夾下生成一個war包,此處為maven-project-1.0-SNAPSHOT.war
2.將 maven-project-1.0-SNAPSHOT.war
放到 apache-tomcat-9.0.78\webapps
文件夾下
3.啟動 startup.bat
腳本,啟動完成后,在瀏覽器輸入項目地址,即可查看web項目
項目地址組成: http://localhost:8080/
,后面再加上war包名稱
以我剛剛運行的項目為例,地址就是 http://localhost:8080/maven-project-1.0-SNAPSHOT
6. Maven的依賴管理
6.1 依賴配置
依賴:指的是當前項目運行所需的jar包,一個項目可以設置多個依賴
<!-- 設置當前項目所依賴的所有jar -->
<dependencies><!-- 設置具體的依賴 --><dependency><groupId>junit</groupId> <!-- 依賴所屬群組id --><artifactId>junit</artifactId> <!-- 依賴所屬項目id --><version>3.8.1</version> <!-- 依賴版本號 --></dependency>
</dependencies>
6.2 依賴傳遞
6.2.1 依賴傳遞演示
依賴具有傳遞性:
- 直接依賴:在當前項目中通過依賴配置建立的依賴關系
- 間接依賴:被依賴具的資源如果依賴其他資源,當前項目間接依賴其他資源
1.創建一個空項目maven-project
,然后在項目下面創建三個模塊,分別取名project01
、project02
、project03
創建空工程:
創建三個模塊:右鍵 maven-project -> New -> Module
最終得到項目結構如下:
2.對三個模塊的pom.xml進行以下修改
project01
、project02
、project03
中分別添加log4j
的1.2.12
、1.2.13
、1.2.14
的版本依賴project01
中添加junit 4.12
版本的依賴- 把
project03
作為依賴資源添加到project02
中
注:如果當前項目,想使用另一個項目的東西,那么就把另一個項目作為依賴資源添加到當前項目中
project01
的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"><modelVersion>4.0.0</modelVersion><!--project01的項目坐標--><groupId>com.example</groupId><artifactId>project01</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><!--添加junit依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies></project>
project02
的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"><modelVersion>4.0.0</modelVersion><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.13</version></dependency><!--添加project03依賴--><dependency><groupId>com.example</groupId><artifactId>project03</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>
project03
的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"><modelVersion>4.0.0</modelVersion><!--project03的項目坐標--><groupId>com.example</groupId><artifactId>project03</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency></dependencies></project>
3.以上配置完成后,點擊Maven的刷新按鈕,可以看到最終依賴的結構如下:
- 使用紅色框圈中的依賴
jar
包為直接依賴 - 使用紫色框圈中的依賴
jar
包為間接依賴
解釋:
1.對于project01
項目而言,直接依賴了log4j:log4j:1.2.12
和junit:junit:4.12
,間接依賴了org:hamcrest:hamcrest-core:1.3
2.對于project02
項目而言,直接依賴了log4j:log4j:1.2.13
和com.example:project03:1.0-SNAPSHOT
,間接依賴了log4j:log4j:1.2.14
3.對于project03
項目而言,直接依賴了log4j:log4j:1.2.14
6.2.2 依賴傳遞沖突
依賴傳遞沖突問題:
- 路徑優先:當依賴中出現相同資源時,層級越深,優先級越低,反之優先級越高。
- 聲明優先:當資源在相同層級被依賴時,配置順序靠前的覆蓋順序靠后的。
特殊優先:當同級配置了相同資源的不同版本,后配置的覆蓋先配置的
1.路徑優先:當依賴中出現相同資源時,層級越深,優先級越低,反之優先級越高。
此處project02
項目中同時依賴了log4j的1.2.13和1.2.14版本,由于1.2.13是直接依賴,層級更淺,優先級更高,所以最終使用的是1.2.13
的版本依賴。
注:idea中log4j的1.2.14版本依賴顏色顯示灰色,表示它未生效。
2.聲明優先:當資源在相同層級被依賴時,配置順序靠前的覆蓋順序靠后的。
對 project01
、project02
、project03
,3個模塊項目的pom.xml
進行以下修改:
project01
的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"><modelVersion>4.0.0</modelVersion><!--project01的項目坐標--><groupId>com.example</groupId><artifactId>project01</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加project03依賴--><dependency><groupId>com.example</groupId><artifactId>project03</artifactId><version>1.0-SNAPSHOT</version></dependency><!--添加project02依賴--><dependency><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>
project02
的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"><modelVersion>4.0.0</modelVersion><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.13</version></dependency></dependencies></project>
project03
的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"><modelVersion>4.0.0</modelVersion><!--project03的項目坐標--><groupId>com.example</groupId><artifactId>project03</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency></dependencies></project>
最終的依賴結構如下:在project01
的pom.xml中,先添加了project03
的依賴,后添加了project02
的依賴,它們的log4j
依賴在同一個層級,由于project03
先添加,所以project03
的log4j 1.2.14
依賴生效了。
3.特殊優先:當同級配置了相同資源的不同版本,后配置的覆蓋先配置的
對project02
的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"><modelVersion>4.0.0</modelVersion><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加log4j依賴,1.2.13版本--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.13</version></dependency><!--添加log4j依賴,1.2.14版本--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency></dependencies></project>
同一個pom.xml里寫了兩份一樣的依賴,后配置的依賴覆蓋前面的,所以此處最終是1.2.14
版本的log4j生效。
6.3 可選依賴
可選依賴:指對外隱藏當前所依賴的資源(不透明)
也就是說,其他使用該依賴資源的人,不知道使用了它,因為該依賴資源被隱藏了
依賴中添加optional
配置為true
,即可隱藏依賴:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><optional>true</optional> <!--隱藏依賴-->
</dependency>
演示:原始的project01
和project02
的pom.xml配置如下
project01
的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"><modelVersion>4.0.0</modelVersion><!--project01的項目坐標--><groupId>com.example</groupId><artifactId>project01</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加project02依賴--><dependency><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>
project02
的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"><modelVersion>4.0.0</modelVersion><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加junit依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies></project>
此時能看見junit
依賴:
然后修改project02
的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"><modelVersion>4.0.0</modelVersion><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加junit依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><optional>true</optional> <!--隱藏依賴--></dependency></dependencies></project>
點擊刷新按鈕后,發現junit
依賴不見了(被隱藏了):
6.4 排除依賴
排除依賴:指主動斷開依賴的資源,被排除的資源無需指定版本(不需要)
也就是說,自己不需要使用別人的依賴資源,主動排除了它
依賴中添加exclusion
,并指定groupId
和 artifactId
,即可排除依賴:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><exclusions><!--排除依賴--><exclusion><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId></exclusion></exclusions>
</dependency>
演示:修改project01
和project02
的pom.xml
配置為以下
project01
的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"><modelVersion>4.0.0</modelVersion><!--project01的項目坐標--><groupId>com.example</groupId><artifactId>project01</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加project02依賴--><dependency><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>
project02
的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"><modelVersion>4.0.0</modelVersion><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加junit依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies></project>
此時能看見junit
中還依賴了org.hamcrest:hamcrest-core:1.3
:
然后修改project02
的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"><modelVersion>4.0.0</modelVersion><!--project02的項目坐標--><groupId>com.example</groupId><artifactId>project02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--添加junit依賴--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><exclusions><!--排除依賴--><exclusion><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId></exclusion></exclusions></dependency></dependencies></project>
點擊刷新按鈕后,發現org.hamcrest:hamcrest-core:1.3
依賴不見了(被排除了):
6.5 依賴范圍
依賴范圍:依賴的jar
包默認情況下,可以在任何地方使用,可以通過scope
標簽設定其作用范圍。
作用范圍:
- 主程序范圍內有效(main文件夾范圍內)
- 測試程序范圍內有效(test文件夾范圍內)
- 是否參與打包(package指令范圍內)
范圍 | 主代碼 | 測試代碼 | 打包 | 例子 |
---|---|---|---|---|
compile | √ | √ | √ | log4j |
test | √ | junit | ||
provided | √ | √ | servlet-api | |
runtime | √ | jdbc |
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope> <!--測試范圍-->
</dependency>
注:帶有依賴范圍的資源在進行傳遞時,作用范圍將受到影響
7. 生命周期與插件
maven項目構建命令如下:
# 編譯
mvn compile# 清理
mvn clean # 測試
mvn test # 打包
mvn package # 安裝到本地倉庫
mvn install
這些maven項目構建命令在Idea中對應的位置如下:
7.1 構建生命周期
一個典型的 Maven 構建(build)生命周期是由以下幾個階段的序列組成的:
階段 | 處理 | 描述 |
---|---|---|
validate | 驗證項目 | 驗證項目是否正確且所有必須信息是可用的 |
compile | 執行編譯 | 源代碼編譯在此階段完成 |
test | 測試 | 使用適當的單元測試框架(例如junit)運行測試 |
package | 打包 | 創建 jar/war 包如在 pom.xml 中定義提及的包 |
verify | 檢查 | 對集成測試的結果進行檢查,以保證質量達標 |
install | 安裝 | 安裝打包的項目到本地倉庫,以供其他項目使用 |
deploy | 部署 | 拷貝最終的工程包到遠程倉庫中,以共享給其他開發人員和工程 |
Maven 有以下三個標準的生命周期:
clean
:項目清理的處理,清理工作default
:項目部署的處理,核心工作,例如編譯、測試、打包、部署等site
:項目站點文檔創建的處理,產生報告,發布站點
1.clean 生命周期
生命周期階段 | 描述 |
---|---|
pre-clean | 執行一些需要在clean之前完成的工作 |
clean | 移除所有上一次構建生成的文件 |
post-clean | 執行一些需要在clean之后立刻完成的工作 |
2.default (build) 生命周期
生命周期階段 | 描述 |
---|---|
validate(校驗) | 校驗項目是否正確并且所有必要的信息可以完成項目的構建過程 |
initialize(初始化) | 初始化構建狀態,比如設置屬性值 |
generate-sources(生成源代碼) | 生成包含在編譯階段中的任何源代碼 |
process-sources(處理源代碼) | 處理源代碼,比如說,過濾任意值 |
generate-resources(生成資源文件) | 生成將會包含在項目包中的資源文件 |
process-resources (處理資源文件) | 復制和處理資源到目標目錄,為打包階段最好準備 |
compile(編譯) | 編譯項目的源代碼 |
process-classes(處理類文件) | 處理編譯生成的文件,比如說對Java class文件做字節碼改善優化 |
generate-test-sources(生成測試源代碼) | 生成包含在編譯階段中的任何測試源代碼 |
process-test-sources(處理測試源代碼) | 處理測試源代碼,比如說,過濾任意值 |
generate-test-resources(生成測試資源文件) | 為測試創建資源文件 |
process-test-resources(處理測試資源文件) | 復制和處理測試資源到目標目錄 |
test-compile(編譯測試源碼) | 編譯測試源代碼到測試目標目錄 |
process-test-classes(處理測試類文件) | 處理測試源碼編譯生成的文件 |
test(測試) | 使用合適的單元測試框架運行測試(Juint是其中之一) |
prepare-package(準備打包) | 在實際打包之前,執行任何的必要的操作為打包做準備 |
package(打包) | 將編譯后的代碼打包成可分發格式的文件,比如JAR、WAR或者EAR文件 |
pre-integration-test(集成測試前) | 在執行集成測試前進行必要的動作,比如說,搭建需要的環境 |
integration-test(集成測試) | 處理和部署項目到可以運行集成測試環境中 |
post-integration-test(集成測試后) | 在執行集成測試完成后進行必要的動作。比如說,清理集成測試環境 |
verify (驗證) | 運行任意的檢查來驗證項目包有效且達到質量標準 |
install(安裝) | 安裝項目包到本地倉庫,這樣項目包可以用作其他本地項目的依賴 |
deploy(部署) | 將最終的項目包復制到遠程倉庫中與其他開發者和項目共享 |
3.site 生命周期
生命周期階段 | 描述 |
---|---|
pre-site | 執行一些需要在生成站點文檔之前完成的工作 |
site | 生成項目的站點文檔 |
post-site | 執行一些需要在生成站點文檔之后完成的工作,并且為部署做準備 |
site-deploy | 將生成的站點文檔部署到特定的服務器上 |
7.2 插件
插件:每個生命周期中都包含著一系列的階段(phase),這些 phase 就相當于 Maven 提供的統一的接口,然后這些 phase 的實現由 Maven 的插件來完成。
- 插件與生命周期內的階段綁定,在執行到對應生命周期時執行對應的插件功能
- 默認maven在各個生命周期上綁定有預設的功能
- 通過插件可以自定義其他功能
我們在輸入 mvn 命令的時候 比如 mvn clean
,clean 對應的就是 Clean 生命周期中的 clean 階段,但是 clean 的具體操作是由 maven-clean-plugin
來實現的,所以說 Maven 生命周期的每一個階段的具體實現都是由 Maven 插件實現的。
插件類型:
類型 | 描述 |
---|---|
Build plugins | 在構建時執行,并在 pom.xml 的 元素中配置 |
Reporting plugins | 在網站生成過程中執行,并在 pom.xml 的 元素中配置 |
常用插件的列表:
插件 | 描述 |
---|---|
clean | 構建之后清理目標文件,刪除目標目錄 |
compiler | 編譯 java 源文件 |
surefile | 運行 junit單元測試,創建測試報告 |
jar | 從當前工程中構建 jar 文件 |
war | 從當前工程中構建 war 文件 |
javadoc | 為工程生成 javadoc |
antrun | 從構建過程的任意一個階段中運行一個 ant 任務的集合 |
插件示例:
<build><plugins><!--生成源代碼的插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>3.2.1</version><executions><execution><goals><goal>jar</goal></goals><phase>generate-test-resources</phase> <!--到生成測試源代碼階段,執行該插件--></execution></executions></plugin></plugins>
</build>
點擊刷新后可以發現 Plugins
下多了個 source
插件,就是剛剛添加 maven-source-plugin
插件
測試插件是否有效:由于generate-test-resources
階段在test
階段之前,也就是說執行到test
階段,也必然執行了generate-test-resources
階段,所以,我們點擊 Lifecycle
下的test
按鈕,使項目執行到test
階段。
可以看到,左側生成了一個源碼的jar包,打開該jar包,就能查看項目的源碼。