1、介紹
1.1、概念
Maven 是 Apache 下的一個純 Java 開發的開源項目,是一個項目構建和管理的工具。將項目開發和管理過程抽象成一個項目對象模型(POM)。
1.2、作用
-
項目構建:提供標准的、跨平台的自動化項目構建方式
-
依賴管理:方便快捷的管理項目依賴的資源(jar包),避免資源間的版本沖突問題
-
統一開發結構:提供標准的、統一的項目結構
2、下載與安裝
2.1、下載
我們安裝在本地,所以選擇windows版本。
2.2、解壓
因為maven是免安裝綠色版本,所以直接解壓即可使用。
各目錄結構說明:
-
bin:可執行程序目錄
-
boot:maven自身的啟動加載器
-
conf:maven配置文件的存放目錄
-
lib:maven運行所需庫的存放目錄
2.3、配置環境變量
打開windows設置------>搜索環境變量------>
使用命令 mvn -version
來測試maven是否配置成功
出現上圖字樣,則表示maven已經安裝配置完畢!撒花❀❀❀
3、maven基礎概念
3.1、倉庫
用於存儲資源,主要是各種jar包。
3.1.1、倉庫分類
-
本地倉庫:自己電腦上存儲資源的倉庫,連接遠程倉庫獲取資源
-
遠程倉庫:非本機電腦上的倉庫,為本地倉庫提供資源
-
- 中央倉庫:Maven團隊維護,存儲所有資源的倉庫
-
私服:部門/公司范圍內存儲資源的倉庫,從中央倉庫獲取資源
3.1.2、私服的作用
- 保存具有版權的資源,包含購買或自主研發的jar包;中央倉庫中的jar包都是開源的,不能存儲具有版權的資源
- 一定范圍內共享資源,僅對內部開放,不對外共享
3.2、坐標
3.2.1、介紹
maven中的坐標用於描述倉庫資源的位置。
3.2.2、主要組成
-
groupId:定義當前maven項目隸屬組織名稱(通常是域名反寫,例如org.apache)
-
artifactId:定義當前maven項目名稱(通常是模板名稱,例如CRM、SMS)
-
version:定義當前項目版本號
3.2.3、作用
使用唯一標識,唯一性定位資源位置,通過該標識可以將資源的識別與下載工作交由機器完成。
3.3、倉庫配置
3.3.1、本地倉庫配置
使用nodpad++打開maven解壓目錄下conf文件夾下的 settings.xml
文件。
打開后,找到第52行,可以看到maven默認下載的jar包放在 ${user.home}/.m2/repository
,即用戶目錄.m2\repository。
jar默認下載目錄。
當然如果想修改jar包下載的地方(即本地倉庫),只需照着如下示例修改成自己的配置即可。
3.3.2、遠程倉庫配置
maven默認連接的遠程倉庫位置。
<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>
3.3.3、鏡像倉庫配置(配置阿里雲鏡像)
在打開的 settings.xml
配置文件中找到 <mirrors></mirrors>
標簽中添加 <mirror></mirror>
節點。
<mirror>
<!--此鏡像的唯一標識符,用來區分不同的mirror元素-->
<id>aliyunmaven</id>
<!--對哪種倉庫進行鏡像,簡單的說就是替代哪個倉庫 -->
<mirrorOf>central</mirrorOf>
<!--鏡像名稱-->
<name>阿里雲公共倉庫</name>
<!--鏡像URL-->
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
4、maven項目
4.1、idea的maven配置
當前項目的maven配置
當創建新項目時的maven配置:
4.2、maven項目構建命令
maven構建命令使用 mvn
開頭,后面添加參數,可以一次執行多個命令,使用空格分隔。
mvn compile #編譯
mvn clean #清理
mvn test #測試
mvn package #打包
mvn install #安裝到本地倉庫
如果是使用idea,則可以使用圖形化界面快捷操作。
4.3、創建空的maven項目
使用idea創建一個空的maven項目。
查看當前項目的結構,使用快捷鍵 ctrl+alt+shift+s
或者使用如下操作:
4.4、創建maven的web項目
使用idea創建一個maven的web項目。
開始從阿里雲倉庫上下載資源。
安裝tomcat插件
在項目的 pom.xml
配置文件中引入
<build>
<plugins>
<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>
雙擊運行 tomcat7:run
命令啟動web項目:
訪問本地80端口,可以看到運行結果:
5、依賴管理
5.1、依賴配置
- 依賴指的是當前項目運行所需要的jar包,一個項目可以設置多個依賴。
- 格式:
<!--設置當前項目所依賴的所有jar包坐標-->
<dependencies>
<!--設置具體的依賴坐標-->
<dependency>
<!--依賴所屬的組織Id-->
<groupId>junit</groupId>
<!--依賴所屬的項目Id-->
<artifactId>junit</artifactId>
<!--依賴的版本號-->
<version>4.11</version>
</dependency>
</dependencies>
5.2、依賴傳遞重要
-
依賴具有傳遞性
-
- 直接依賴:在當前項目中通過依賴配置建立的依賴關系
-
間接依賴:被依賴的資源如果依賴其他資源,當前項目間接依賴其他資源(比較拗口,意思就是如果A依賴B,而B依賴C,那么A就間接依賴C)
-
依賴傳遞沖突問題
-
- 路徑最短者優先原則:當依賴中出現相同的資源時,層級越深,優先級越低,層級越淺,優先級越高
-
路徑相同先聲明優先原則:當資源在相同層級被依賴時,配置順序靠前的覆蓋配置順序靠后的
-
- 特殊優先:當同級配置了相同資源的不同版本,后配置的覆蓋先配置的(概率是書寫錯誤,不應該出現這種情況)
5.3、可選依賴
可選依賴指對外隱藏當前所依賴的資源---不透明。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<optional>true</optional>
</dependency>
5.4、排除依賴重要
排除依賴指主動斷開依賴的資源,被排除的資源無需指定版本---不需要。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
5.5、依賴范圍重要
依賴的jar包默認情況下可以在任何地方使用,可以通過scope標簽設定其作用范圍
作用范圍:
-
主程 序范圍有效(main文件夾范圍內)
-
測試程序范圍有效(test文件夾范圍內)
-
是否參與打包(package指令范圍內)
5.6、依賴范圍傳遞性(了解)
帶有依賴范圍的資源在進行傳遞時,作用范圍將受到影響。具體看使用效果。
6、生命周期與插件
6.1、項目構建生命周期
6.1.1、介紹
maven構建生命周期描述的是一次構建過程經歷了多少個事件
6.1.2、3個階段
maven對項目構建的生命周期划分為3個階段。
6.1.2.1、clean生命周期
-
pre-clean:執行一些需要在clean之前完成的工作
-
clean:移除所有上一次構建生成的文件
-
post-clean:執行一些需要在clean之后立刻完成的工作
6.1.2.2、default構建生命周期
核心工作是編譯、測試、打包、安裝、部署。
在執行某一個操作時,同時會執行該操作前面的所有操作。
6.1.2.3、site構建生命周期
-
pre-site:執行一些需要在生成站點文檔之前完成的工作
-
site:生成項目的站點文檔
-
post-site:執行一些需要在生成站點文檔之后完成的工作,並且為部署做准備
-
site-deploy:將生成的站點文檔部署到特定的服務器上
6.2、插件重要
-
插件與生命周期內的階段綁定,在執行到對應生命周期時執行對應的插件功能
-
默認maven在各個生命周期上綁定有預設的功能
-
通過插件可以自定義其他功能
用戶可以根據需要將任何插件目標綁定到任何生命周期的任何階段,如配置在 generate-test-resources
生成測試資源文件階段的時候使用 maven-source-plugin
插件將main文件夾進行源碼打包。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
7、聚合重要
7.1、作用
用於快速構建maven工程,一次性構建多個項目/模塊。即編譯、測試、打包、部署該模塊的時候會同時操作關聯的模塊。
7.2、制作方式
- 創建一個空模塊,打包類型定義為pom
<packaging>pom</packaging>
- 定義當前模塊進行構建操作時關聯的其他模塊名稱,注意,
module
內的值為關聯模塊的pom文件相對於當前pom文件所在文件夾目錄。
如下示例就是關聯模塊與當前模塊平級,如果關聯模塊位於當前模塊文件夾內,則沒有../
。
<!--當前父模塊有哪些子模塊-->
<modules>
<module>../ssm_controller</module>
<module>../ssm_service</module>
<module>../ssm_dao</module>
<module>../ssm_pojo</module>
</modules>
注意事項:參與聚合操作的模塊最終執行順序與模塊間的依賴有關,與配置順序無關。
8、繼承重要
8.1、作用
通過繼承可以實現在子模塊中沿用父模塊中的配置。
8.2、制作方式
在子模塊中聲明其父模塊坐標與pom文件的位置。
<!-- 定義該模塊的父模塊 -->
<parent>
<groupId>com.itheima</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 填寫父模塊的pom文件所在位置 -->
<relativePath>../ssm/pom.xml</relativePath>
</parent>
8.3、依賴繼承
子模塊將自動繼承父模塊中的依賴。
父模塊maven-java
中引入 spring-boot-starter
依賴,子模塊 maven-java-001
和maven-java-002
將自動繼承父模塊maven-java
中 spring-boot-starter
的依賴。
<groupId>org.xiaorang</groupId>
<artifactId>maven-java</artifactId>
<version>1.0.0-SNAPSHOT</version>
<modules>
<module>maven-java-001</module>
<module>maven-java-002</module>
</modules>
<packaging>pom</packaging>
<!--自定義屬性列表-->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!--在該標簽中編寫的依賴,子模塊會自動繼承-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.3</version>
</dependency>
</dependencies>
8.4、依賴管理
在父模塊中進行依賴管理,子模塊中需要聲明式的引入依賴,但是無需聲明依賴版本,版本將使用父模塊依賴管理中依賴的版本號,達到由父模塊統一控制依賴的版本號。
在父模塊中進行依賴管理:
<!--在該標簽中聲明的依賴,子模塊可以選擇性的繼承,同時省略版本號-->
<dependencyManagement>
<!--具體的依賴-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
在子模塊中聲明式引入依賴:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
9、聚合與繼承的異同點
-
作用:
-
- 聚合用於快速構建項目
-
繼承用於快速配置
-
相同點:
-
- 聚合與繼承的pom.xml文件打包方式均為pom,可以將兩種關系制作到同一pom文件中
-
聚合與繼承均屬於設計型模塊,並無實際的模塊內容
-
不同點:
-
- 聚合時在當前模塊中配置關系,聚合可以感知到參與聚合的模塊有哪些
-
繼承是在子模塊中配置關系,父模塊無法感知哪些子模塊繼承了自己
10、屬性重要
問題:如果對於spring的資源版本都應該使用5.1.9.RELEASE
版本,但是你其中一個資源寫錯了,寫的不是這個版本號或者說想將spring的資源版本都升級到5.2.0.RELEASE
版本,這個時候你是不是需要將所有的spring資源的版本號都改成5.2.0.RELEASE
版本。
方案:屬性
10.1、自定義屬性
- 作用:等同於定義變量,方便統一維護版本號。
- 定義格式:
<!--定義自定義屬性-->
<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
- 調用格式:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
10.2、內置屬性
- 作用:使用maven內置屬性,快速配置。
- 調用格式:
${basedir} ${version}
10.3、Setting屬性
- 作用:使用maven配置文件
setting.xml
中的標簽屬性,用於動態配置。 - 調用格式:
${settings.localRepository
10.4、Java系統屬性
-
作用:讀取Java系統屬性
-
調用格式:
${user.home}
-
系統屬性查詢方式:
mvn help:system
10.5、環境變量屬性
-
作用:使用maven配置文件
setting.xml
中的標簽屬性,用於動態配置 -
調用格式:
${env.JAVA_HOME}
-
環境變量屬性查詢方式:
mvn help:system
11、版本管理
11.1、工程版本
-
SNAPSHOT(快照版本)
-
- 項目開發過程中,為方便團隊成員合作,解決模塊間相互依賴和時時更新的問題,開發者對每個模塊進行構建的時候,輸出的臨時性版本就叫快照版本(測試階段版本)
-
快照版本會隨着開發的進展不斷更新
-
RELEASE(發布版本)
-
- 項目開發進入階段里程碑后,向團隊外部發布較為穩定的版本,這種版本對應的構件文件是穩定的,即便進行功能的后續開發,也不會改變當前發布版本內容,這種版本成為發布版本
11.2、工程版本號約定
約定規范:
-
<主版本>.<次版本>.<增量版本>.<里程碑版本>
-
主版本:表示項目重大架構的變更,如Spring5相較於Spring4的迭代
-
次版本:表示有較大的功能增加和變化,或者全面系統的修復漏洞
-
增量版本:表示有重大漏洞的修復
-
里程碑版本:表明一個版本的里程碑(版本內部)。這樣的版本同下一個正式版本相比,相對來說不是很穩定,有待更多的測試
12、資源配置
-
作用:在任意配置文件引用pom文件中定義的屬性。
-
調用格式:
${屬性名}
-
如何開啟配置文件可以加載pom文件中定義的屬性:
<!--配置資源文件對應的信息-->
<resources>
<resource>
<!--設定配置文件對應的位置目錄,支持使用屬性動態設定路徑-->
<directory>${project.basedir}/src/main/resources</directory>
<!--開啟對配置文件的資源加載過濾-->
<filtering>true</filtering>
</resource>
</resources>
13、多環境開發配置
13.1、多環境配置
<!--創建多環境-->
<profiles>
<!--定義具體的環境:生產環境-->
<profile>
<!--定義環境對應的唯一名稱-->
<id>pro</id>
<!--定義環境中的專用的屬性值-->
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/test</jdbc.url>
</properties>
<!--設置默認啟動-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--定義具體的環境:開發環境-->
<!--格式同上-->
</profiles>
13.2、加載指定環境
-
作用:加載指定環境配置
-
調用格式:
mvn 指令 -p 環境定義id
-
范例:
mvn install -p pro
14、跳過測試
14.1、必要性
如執行maven打包發布項目時,如果測試類中有測試用例代碼,打包maven默認會將測試用例一起編譯並執行,編譯執行不通過則會報錯。
14.2、方法
14.2.1、使用mvn命令
# 不執行測試用例,但編譯測試用例類生成相應的class文件至target/test-classes下
mvn clean install -DskipTests
# 不執行測試用例,也不編譯測試用例類
mvn clean install -Dmaven.test.skip=true
14.2.2、使用idea的maven界面
沒有跳過測試時,雙擊執行打包,控制台輸出沒有測試用例需要執行。
點擊跳過測試后,test生命周期圖標變灰,雙擊執行打包時,控制台輸出測試用例已跳過。
14.2.3、使用配置文件
添加 maven-surefire-plugin
插件,設置跳過測試。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>true</skipTests><!--設置跳過測試-->
</configuration>
</plugin>
可以看到即使沒有點擊跳過測試按鈕,雙擊執行打包時,控制台輸出的依然是測試用例已跳過。
詳細指定:
-
包名路徑,文件名帶后綴
-
支持通配符*,其中
**
表示任何包,*
表示任何字符 -
excludes
優先級高於includes
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<!--詳細指定要跑的測試-->
<includes>
<include>com/jerry/AppTest*.java</include>
</includes>
<!--詳細指定排除的測試-->
<excludes>
<exclude>com/jerry/AppTest.java</exclude>
<exclude>com/jerry/AppTest1.java</exclude>
</excludes>
</configuration>
</plugin>
15、自定義骨架
maven官方通過插件給我們提供了大量的模板,但是這些模板或多或少的都存在一定的問題,無法滿足我們實際的需求,所以我們需要根據自己的需求自定義模板出來。
15.1、生成模板
根據已經存在的項目創建骨架,在pom.xml文件中添加骨架插件 maven-archetype-plugin
。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<version>2.2</version>
</plugin>
在idea的maven界面中可以看到這個插件
使用mvn命令將該項目做成骨架或者使用idea界面的插件按鈕
mvn archetype:create-from-project
生成骨架的時候如果出現如下錯誤,需要在maven安裝目錄將mvn.cmd復制拷貝一份,名字改成mvn.bat。
骨架生成成功
切換到生成的骨架項目目錄
cd target\generated-sources\archetype
向本地倉庫中發布
mvn install
最后執行mvn archetype:crawl
命令 或者使用idea的maven界面中的插件按鈕
執行完畢之后,在maven的本地倉庫目錄中生成一個archetype-catalog.xml文件。
15.2、使用模板
idea安裝 maven archetype catalogs
插件
添加成功之后,在新建maven項目的時候就可以選到剛才創建的骨架。
16、私服
16.1、簡介
私服是架設在局域網的一種特殊的遠程倉庫,目的是代理遠程倉庫及部署第三方構件。有了私服之后,當maven需要下載構件時,直接請求私服,私服上存在則下載到本地倉庫;否則,私服請求外部的遠程倉庫,將構件下載到私服,再提供給本地倉庫下載。
16.2、必要性(優點)
-
減少網絡帶寬流量。如果沒有私服,我們所需的所有構件都需要通過maven的中央倉庫或者第三方的maven倉庫下載到本地,而一個團隊中的所有人都重復的從maven倉庫下載構件無疑加大了倉庫的負載和浪費了外網帶寬,如果網速慢的話,還會影響項目的進程。
-
一定范圍內共享資源,僅對內部開放,不對外共享。很多情況下項目的開發都是再內網進行的,可能根本連接不了maven的中央倉庫和第三方的maven倉庫。
-
加速maven構建
-
部署第三方構件
-
提高穩定性、增強控制
-
降低中央倉庫的負載
16.3、Nexus
16.3.1、簡介
Nexus 是一個專門的 maven 倉庫管理軟件,它不僅能夠搭建 maven 私服,還具有如下一些優點使其日趨成為最流行的 maven 倉庫管理器。
-
提供了強大的倉庫管理功能,構件搜索功能
-
它基於 REST,友好的 UI 是一個 ext.js 的 REST 客戶端
-
它占用較少的內存
-
基於簡單文件系統而非數據庫
16.3.2、下載安裝運行
- 使用docker安裝nexus3。
docker search nexus
docker pull sonatype/nexus3
- 創建docker-compose.yml文件
cat /usr/local/docker/nexus/docker-compose.yml
version: '3'
services:
nexus:
restart: always
image: sonatype/nexus3
container_name: nexus3
ports:
- 8081:8081
volumes:
- /usr/local/docker/nexus/nexus-data:/nexus-data
:wq保存退出。
- 運行nexus3,如果訪問不成功,則需要給nexus-data文件夾賦權限
chmod 777 nexus-data/
。
# 使用docker-compose啟動
docker-compose up -d
# 使用docker-compose停止
docker-compose down
需要查看nexus-data文件夾下的admin.password文件,里面記錄了密碼。
cat admin.password
登錄之后會出現彈窗界面需要你修改密碼。
16.3.3、配置本地倉庫訪問私服的權限
在maven安裝目錄下的settings.xml配置文件中的servers中添加serve節點,因為私服不是誰都可以使用,所以需要配置用戶名和密碼。
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
16.3.4、配置當前項目訪問私服上傳資源的保存位置
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://120.78.177.161:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://120.78.177.161:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
發布資源到私服命令
mvn deploy
注意:id名稱需要與settings.xml配置文件中server節點配置的id保持一致。
可以看到項目快照版本已經上傳到私服。
16.3.5、設置代理倉庫(用於下載資源)
在測試的時候,先將本地倉庫的依賴先刪除掉,迫使項目去私服中下載。
<!-- 私服倉庫配置:從私服下載-->
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://120.78.177.161:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus Plugin Repository</name>
<url>http://120.78.177.161:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
如果沒有開啟匿名訪問,在下載資源的時候會報沒有權限下載。
開啟匿名訪問
idea配置maven總是更新快照。
依賴下載成功
16.3.6、上傳第三方jar包
打開cmd,先跳轉到第三方jar包資源目錄,然后執行如下mvn命令即可:
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.2.28 -Dpackaging=jar -Dfile=fastjson-1.2.28.jar -Durl=http://120.78.177.161:8081/repository/maven-releases/ -DrepositoryId=nexus-releases
查看nexus-releases倉庫,發現有我們上傳的第三方jar包。
至此,大功告成!!!先告一段落,❀❀❀