Maven筆記---超詳細

天下沒有收費的bug發表於2022-06-07

顯眼位置標註來源:此文章為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工程目錄結構:

image-20220607103453550

在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工程目錄對比:

image-20220607104257061


IDEA生成Maven專案

  • 原型建立Maven專案

    image-20220607104522917

    image-20220607104614642


依賴管理(重點)

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

image-20220607105023458

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

image-20220607110233905

  • Maven對專案構建的生命週期劃分為3套

    • clean:清理工作

    • default:核心工作,例如編譯、測試、打包、部署等

    • site:產生報告,釋出站點等

image-20220607110404435

image-20220607110422163

image-20220607110438596

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>

分模組開發與設計(重點)

image-20220607111512770

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-開始的配置檔案


聚合(重點)

image-20220607112856186

  • 模組打包型別

    • 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>
    
  • 注意:參與聚合操作的模組最終執行順序與模組間的依賴關係有關,與配置順序無關


繼承(重點)

image-20220607113444192

  • 作用:通過繼承可以實現在子工程中沿用父工程中的配置(與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>

image-20220607114102525


繼承與聚合

作用:

  • 聚合用於快速構建專案
  • 繼承用於快速配置

相同點:

  • 聚合與繼承的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

版本管理

image-20220607115132794

  • 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 使用介面跳過測試

image-20220607134614876

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>

相關文章