顯眼位置標註來源:此文章為B站課程黑馬程式設計師Maven全套教程筆記,由本人整理。
Maven簡介
Maven的本質是一個專案管理工具,將專案開發和管理過程抽象成一個專案物件模型(POM)
POM (Project Object Model):專案物件模型
Maven的作用:
-
專案構建:提供標準的、跨平臺的自動化專案構建方式
-
依賴管理:方便快捷的管理專案依賴的資源(jar包),避免資源間的版本衝突問題
-
統一開發結構:提供標準的、統一的專案結構
Maven基礎概念(重點)
倉庫
用於儲存資源,包含各種jar包
倉庫分類
- 本地倉庫
- 遠端倉庫(私服和中央倉庫)
座標
Maven中的座標用於描述倉庫中資源的位置
-
座標的主要組成:
- groupId:定義當前Maven專案隸屬組織名稱(通常是域名反寫)
- artifactId:定義當前Maven專案名稱(通常是模組名稱)
- version:定義當前版本號
- packaging:定義該專案的打包方式
-
座標的作用:使用唯一的標識,唯一性定位資源位置,通過該標識可以將資源的識別與下載交由機器完成。
倉庫配置
-
本地倉庫配置:
- 預設位置
<localRepository>${user.home}/.m2/repository</localRepository>
- 自定義位置
<localRepository>D:\maven\repository</localRepository>
-
遠端倉庫配置:
<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>
- 映象倉庫配置:
在setting檔案中配置阿里雲映象倉庫
<mirrors>
<mirror>
<!-- 此映象的唯一識別符號,用來區分不同的mirror元素 -->
<id>nexus-aliyun</id>
<!-- 對那種倉庫進行映象(就是替代哪種倉庫)-->
<mirrorOf>central</mirrorOf>
<!-- 映象名稱 -->
<name>Nexus aliyun</name>
<!-- 映象URL -->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
第一個Maven專案(重點)
手動生成Maven專案
Maven工程目錄結構:
在src同層目錄下建立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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>project-java</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
Maven專案構建命令
Maven構建命令使用mvn開頭,後面加功能引數,可以一次執行多個命令,使用空格分隔
mvn compile #編譯
mvn clean #清理
mvn test #測試
mvn package #打包
mvn install #安裝到本地倉庫
使用外掛生成工程
-
建立工程
mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
-
建立java工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=java-project - DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot - DinteractiveMode=false
-
建立web工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project - DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot - DinteractiveMode=false
java工程與web工程目錄對比:
IDEA生成Maven專案
-
原型建立Maven專案
依賴管理(重點)
1 依賴配置
依賴指的是當前專案執行所需要的jar,一個專案可以設定多個依賴
格式:
<!--設定當前專案所依賴的所有jar-->
<dependencies>
<!--設定具體的依賴-->
<dependency>
<!--依賴所屬群組id-->
<groupId></groupId>
<!--依賴所屬專案id-->
<artifactId></artifactId>
<!--依賴版本號-->
<version></version>
</dependency>
</dependencies>
2 依賴傳遞
-
依賴具有傳遞性,包括直接傳遞和間接傳遞。
- 直接傳遞:在當前專案中通過依賴配置建立的依賴關係(A使用B,A和B就是直接傳遞)
- 間接傳遞:被依賴的資源如果依賴其他資源,當前專案間接依賴其他資源(比較拗口,意思是如果A依賴B,而B依賴C,那麼A和C之間就是間接傳遞)
-
依賴傳遞的衝突問題
- 路徑優先:當依賴中出現相同的資源時,層級越深,優先順序越低,層級越淺,優先順序越高
書本:1度--2度--spring1.0
齒輪:1度--2度--3度--spring2.0
深度不同,路徑優先,與載入順序無關。最終會使用2度中的spring1.0版本
- 宣告優先:當資源在相同層級被依賴時,配置順序靠前的覆蓋配置順序靠後的
書本:1度--2度--spring1.0
齒輪:1度--2度--spring2.0
深度相同,宣告優先,如果書本的1度宣告在齒輪的1度前面,則使用書本中的spring1.0版本
- 特殊優先:當同級配置了相同資源的不同版本,後配置的覆蓋先配置的
書本:1度--2度--spring2.0
書本:1度--2度--spring1.0
同一個配置檔案中,後配置的版本覆蓋先配置的版本,與版本號大小無關,最終會使用spring1.0
3 可選依賴
- 可選依賴指的是對外隱藏當前所依賴的資源---不透明
true
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--新增下面這一行-->
<optional>true</optional>
</dependency>
4 排除依賴
- 排除依賴指主動斷開依賴的資源,被排除的資源無需指定版本---不需要
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
</dependency>
5 依賴範圍
- 依賴的jar包預設情況可以在任何地方使用,可以通過scope標籤設定其作用範圍
- 作用範圍:
- 主程式範圍有效(main資料夾範圍內)
- 測試程式範圍有效(test資料夾範圍內)
- 是否參與打包(package資料夾範圍內)
生命週期與外掛
1 生命週期
- 專案構建生命週期
Maven專案構建生命週期描述的是一次構建過程經歷了多少個事件
compile – test-compile – test – packege – Install
-
Maven對專案構建的生命週期劃分為3套
-
clean:清理工作
-
default:核心工作,例如編譯、測試、打包、部署等
-
site:產生報告,釋出站點等
-
2 外掛
- 外掛與生命週期內的階段繫結,在執行到對應的生命週期時執行對應的外掛功能
- 預設maven在各個生命週期上繫結有預設功能
- 通過外掛可以自定義其他功能
<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>
分模組開發與設計(重點)
1 ssm_pojo拆分
- 新建模組 ssm_pojo
- 拷貝原始專案中對應的相關內容到ssm_pojo模組中
- 實體類(User)
- 配置檔案(無)
2 ssm_dao拆分
-
新建模組
-
拷貝原始專案中對應的相關內容到ssm_dao模組中
-
資料層介面(UserDao)
-
配置檔案:保留與資料層相關配置檔案(3個)
注意:分頁外掛在配置中與SqlSessionFactoryBean繫結,需要保留
- pom.xml:引入資料層相關座標即可,刪除springmvc相關座標
- spring
- mybatis
- spring 整合mybatismysql
- druid
- pagehelper
- 直接依賴ssm_pojo ( 對ssm_pojo模組執行install指令,將其安裝到本地倉庫)
如果沒有對ssm_pojo模組執行install指令,本地倉庫中找不到這個模組的jar包,就會報錯
-
3 ssm_service拆分
-
新建模組
-
拷貝原始專案中對應的相關內容到ssm_service模組中
- 業務層介面與實現類(UserService、UserServicelmpl)
- 配置檔案:保留與資料層相關配置檔案(1個)
- pom.xml: 引入資料層相關座標即可,刪除springmvc相關座標
- spring
- junit
- spring整合junit
- 直接依賴ssm_dao (對ssm_dao模組執行install指令,將其安裝到本地倉庫)
- 間接依賴ssm_pojo (由ssm_dao模組負責依賴關係的建立)
-
修改service模組spring核心配置檔名,新增模組名稱,格式: applicationContext-service.xml
- 修改dao模組spring核心配置檔名,新增模組名稱,格式: applicationContext-dao.xml
- 修改單元測試引入的配置檔名稱,由單個檔案修改為多個檔案
4 ssm_control拆分
-
新建模組(使用webapp模板)
-
拷貝原始專案中對應的相關內容到ssm_controller模組中
-
表現層控制器類與相關設定類(UserController、異常相關……)
-
配置檔案:保留與表現層相關配置檔案(1個)、伺服器相關配置檔案 (1個)
-
pom.xml:引入資料層相關座標即可,刪除springmvc相關座標
- spring
- springmvc
- jackson
- servlet
- tomcat伺服器外掛
- 直接依賴ssm_service (對ssm_service模組執行install指令,將其安裝到本地倉庫)
- 間接依賴ssm_dao、ssm_pojo
-
修改web.xml配置檔案中載入spring環境的配置檔名稱,使用*通配,載入所有applicationContext-開始的配置檔案
-
聚合(重點)
-
模組打包型別
- pom:聚合父模組
- jar:springboot專案
- war:web專案
-
作用:聚合用於快速構建Maven工程,一次性構建多個專案/模組。
-
製作方式:
- 建立一個空模組,打包型別定義為pom
<packaging>pom</packaging>
- 定義當前模組進行構建操作時關聯的其他模組名稱(引入其他模組)
<modules> <module>模組地址:ssm_controller</module> <module>模組地址:ssm_service</module> <module>模組地址:ssm_dao</module> <module>模組地址:ssm_pojo</module> </modules>
-
注意:參與聚合操作的模組最終執行順序與模組間的依賴關係有關,與配置順序無關
繼承(重點)
-
作用:通過繼承可以實現在子工程中沿用父工程中的配置(與Java類似)
-
製作方式:在子工程中生名其父工程座標與對應的位置
<!--定義該工程的父工程-->
<parent>
<groupId>com.itheima</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<!--填寫父工程的pom檔案(非必要)-->
<relativePath>父工程pom檔案地址:/ssm/pom.xml</relativePath>
</parent>
- 在父工程中定義依賴管理
<!--宣告此處進行依賴管理-->
<dependencyManagement>
<!--具體的所有依賴-->
<dependencies>
<!--具體的某個依賴,如:spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
- 繼承依賴使用:
在子工程中定義依賴關係,無需宣告依賴版本,版本參照父工程中依賴的版本
<dependencies>
<!--具體的某個依賴,如:spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
繼承與聚合
作用:
- 聚合用於快速構建專案
- 繼承用於快速配置
相同點:
- 聚合與繼承的pom.xml檔案打包方式均為pom,可以將兩種關係製作到同一個pom檔案中
- 聚合與繼承均屬於設計型模組,並無實際的模組內容
不同點:
- 聚合是在當前模組中配置關係,聚合可以感知到參與聚合的模組有哪些
- 繼承是在子模組中配置關係,父模組無法感知哪些子模組繼承了自己
屬性(重點)
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>
2 內建屬性
- 作用:使用Maven內建屬性,快速配置
- 呼叫格式:
${basedir}
${version}
3 Setting屬性
- 作用:使用Maven配置檔案setting.xml中的標籤屬性,用於動態配置
- 呼叫格式:
${settings.localRepository}
4 Java系統屬性
- 作用:讀取Java系統屬性
- 呼叫格式:
${user.home}
- 系統屬性查詢方式:
mvn help:system
5 環境變數屬性
- 作用:使用Maven配置檔案setting.xml中的標籤屬性,用於動態配置
- 呼叫格式:
${env.JAVA_HOME}
- 環境變數屬性查詢方式:
mvn help:system
版本管理
- SNAPSHOT(快照版本)
- RELEASE(釋出版本)
- 工程版本號約定
- 約定規範:
- <主版本>.<次版本>.<增量版本>.<里程碑版本>
- 主版本:表示專案重大架構的變更,如: spring5相較於spring4的迭代
- 次版本:表示有較大的功能增加和變化,或者全面系統地修復漏洞
- 增量版本:表示有重大漏洞的修復
- 里程碑版本:表明一個版本的里程碑(版本內部)。這樣的版本同下一個正式版本相比,相對來說不是很穩定,有待更多的測試
- 範例:
5.1.9.RELEASE
- 約定規範:
資源配置
配置檔案引用pom屬性
- 作用:在任意配置檔案中載入pom檔案中定義的屬性
- 呼叫格式:${地址}
${jdbc.url}
- 開啟配置檔案載入pom屬性
<!--配置資原始檔對應的資訊-->
<resources>
<resource>
<!--設定配置檔案對應的位置目錄,支援使用屬性動態設定路徑-->
<directory>地址</directory>
<!--開啟對配置檔案的資源載入過濾-->
<filtering>true</filtering>
</resource>
</resources>
多環境開發配置
- 作用:載入指定環境(開發環境和生產環境的配置檔案不同)
- 呼叫格式
mvn 指令 –P 環境定義id
例如:mvn install –P pro_env
<!--建立多環境-->
<profiles>
<!--定義具體的環境:生產環境-->
<profile>
<!--定義環境對應的唯一名稱-->
<id>開發環境名稱:pro_env</id>
<!--定義環境中的專用的屬性值-->
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--定義具體的環境:開發環境-->
<!--格式同上-->
<id>dev_env</id>
......
</profiles>
跳過測試(瞭解)
1 跳過測試環節的應用場景
- 整體模組功能未開發
- 模組中某個功能未開發完畢
- 單個功能更新除錯導致其他功能失敗
- 快速打包
2 使用命令跳過測試
- 命令
mvn 指令-D skipTests
- 注意事項
- 執行的指令生命週期必須包含測試環節
3 使用介面跳過測試
4 使用配置跳過測試
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests><!-- -->
<includes> <!-- -->
<include>**/User*Test.java</include>
</includes>
<excludes><!-- -->
<exclude>**/User*TestCase.java</exclude>
</excludes>
</configuration>
</plugin>