Jave-Maven詳解

語言: CN / TW / HK

一、什麼是Maven?

Apache Maven是一個軟體專案管理的綜合工具。基於專案物件模型(POM)的概念,提供了幫助管理構建、文件、報告、依賴、釋出等方法,Maven簡化和標準化專案建設過程。處理編譯,分配,文件,團隊協作和其他任務的無縫連線。 Maven增加可重用性並負責建立相關的任務。

在這裡插入圖片描述

1)Maven好處

  • 可以將專案過程規範化、自動化、高效化以及強大的可擴充套件性,利用maven自身及其外掛還可以獲得程式碼檢查報告、單元測試覆蓋率、實現持續整合等等。

  • 使得專案的管理變得容易,構建專案的速度更快,由於Maven提供了倉庫的概念去管理jar包,所以用git或者svn的時候,儲存構建的專案體積會更小。

2)作用

管理專案的構建、文件生成、報告、依賴、SCMs(software configuration Management)、分佈、分發、郵件列表。

二、Maven的基本原理

採用遠端倉庫和本地倉庫以及一個核心的配置檔案pom.xml,pom.xml中定義的jar檔案從遠端倉庫下載到本地倉庫,各個專案使用同一個本地倉庫的jar,同一個版本的jar只需下載一次,而且避免每個應用都去拷貝jar。同時它採用了現在流行的外掛體系架構,所以maven的核心非常的小,只有幾兆大小的檔案,在執行maven任務時,才會自動下載需要的外掛。 

具體的概念模型如下圖: 在這裡插入圖片描述 Maven官方把maven定義為一個專案管理工具,下面我們來看看maven給我們的專案管理做了哪些工作?

  • 專案標準化

Maven專案具有統一的專案結構,這個專案結構是參考業界的最佳實踐而成,為後面使用統一的maven命令打下了基礎,如測試mvn test、打包mvn package等,無需寫一行指令碼,就可以方便的實現眾多功能。

  • 文件和報告

使用mvn site可以快速生成專案站點,apache很多開源專案站點都採用maven生成,會出現built by maven字樣的圖示。

  • 類庫管理

類庫管理是maven一個比較核心的功能,我們就需要將專案所依賴的類庫加入到pom.xml中,那麼maven會自動將依賴的類庫下載到本地,並且下載的類庫如果還依賴其他的類庫,它也會自動下載過來,這樣我們就不需要一個一個類庫去下載了。

釋出管理

使用maven可以方便的進行專案發表管理。在專案開發到一定階段,可以使用mvn package打包,它會自動先執行mvn test,跑所有的Test Case,只有全部通過才能正確打包。生成的war包(如果專案的packaging為war)在target目錄下。這個 war包與使用ant指令碼生成一樣,但無需一行指令碼,這也是maven對比ant的優勢之一。使用mvn install將編譯和打包好的檔案釋出到本地倉庫中。使用mvn deploy在整合或者釋出環境下執行,將最終版本的包拷貝到遠端的repository。

三、Maven安裝

官網地址:http://maven.apache.org/ Maven下載地址:http://maven.apache.org/download.cgi 在這裡插入圖片描述 這裡我兩個環境的版本都下載,分別在我本機和linux虛擬機器安裝。

1)Window安裝Maven

1、解壓

```bash

解壓的目錄

D:\software\Maven\apache-maven-3.8.4-bin ``` 在這裡插入圖片描述 Maven根目錄檔案介紹: - bin:Maven的執行指令碼。bin\mvn.cmd是基於windows的指令碼。在cmd中每輸入一條mvn的命令都是在呼叫並執行這些指令碼。 - boot:該專案只有一個檔案plexus-classworlds-2.5.2.jar。他是一個類載入器的框架,相當於對JDK中的類的載入器,提供了豐富的語法以此用來方便配置,Maven使用該框架載入自己的類庫。 - conf:該目錄包含了一個非常重要的檔案setting.xml。配置該檔案就可以在Project中定製Maven的行為。 - lib:包含了所有Maven執行時需要的Java類庫以及用到的第三方類庫。 - LICENSE:軟體許可 - NOTICE:軟體引用的三方軟體 - README.txt:包含了Maven的簡介

2、Maven環境變數配置

  • 依賴Java,需要配置JAVA_HOME,沒有裝jdk的還得先裝jdk

  • 設定Maven自身自身的執行環境,需要配置MAVEN_HOME

  • 配置完JAVA_HOME和MAVEN_HOME,還得配置Path,在Path加上:%JAVA_HOME%\bin和%MAVEN_HOME%\bin

在這裡插入圖片描述

3、驗證

```bash

這裡使用git bash

$ java -version $ mvn -v ``` 在這裡插入圖片描述

4、配置本地倉庫(資源下到哪)

```bash

建立本地存放jar包目錄

D:\software\Maven\repository

找到maven安裝目錄下conf/settings.xml

``` 在這裡插入圖片描述

5、配置阿里映象倉庫(資源從哪來)

先查詢預設的配置,在lib目錄下隨便找個jar包用解壓工具開啟-》再回到上層目錄-》ctrl+F搜尋pom.找到pom-4.0.0.xml-》把這個檔案拖出來開啟 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 但是注意不是去修改jar包裡面的這個配置,還是回到conf/setting.xml這個配置檔案,修改這個配置檔案。

```xml

nexus-aliyun

central

Nexus aliyun

http://maven.aliyun.com/nexus/content/groups/public ``` 在這裡插入圖片描述

2)Linux安裝Maven

1、下載解壓

bash $ mkdir -p /opt/software $ cd /opt/software $ wget http://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz $ tar -zvxf apache-maven-3.8.4-bin.tar.gz -C /opt/software/

2、配置環境變數

```bash

在/etc/profile

export PATH=/opt/software/apache-maven-3.8.4/bin:$PATH

載入生效

$ source /etc/profile ```

3、驗證

bash $ java -version $ mvn -v 在這裡插入圖片描述

四、建立Maven專案

1)手動構建maven專案

預設git bash是沒有tree命令的,這裡提供下載地址: 官網下載地址:http://gnuwin32.sourceforge.net/packages/tree.htm 百度雲下載地址: 連結:http://pan.baidu.com/s/17fc79rQUQSnBhWzej9xd9g 提取碼:6666 把tree.exe放到git安裝目錄下的usr/bin/目錄下

1、建立檔案

```bash

檢視建立的目錄和目錄結構

$ tree hello/ $ cat hello/src/main/java/com/test2022/Hello.java $ cat hello/src/test/java/com/test2022/HelloTest.java $ cat hello/pom.xml ``` 在這裡插入圖片描述 在這裡插入圖片描述

2、編譯(mvn compile)

bash $ cd hello $ mvn compile 發現編譯報錯了:

【問題】 [ERROR] 不再支援源選項 5。請使用 7 或更高版本。 [ERROR] 不再支援目標選項 5。請使用 7 或更高版本。

在這裡插入圖片描述 - 【解決方案一】修改全域性,修改maven安裝目錄下conf/setting.xml檔案,配置jdk,內容如下:

xml <profile> <id>jdk-13</id> <activation> <activeByDefault>true</activeByDefault> <jdk>13</jdk> </activation> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>13</maven.compiler.source> <maven.compiler.target>13</maven.compiler.target> </properties> </profile> - 【解決方案二】修改區域性,修改專案目錄下的 pom.xml檔案,配置jdk,內容如下: xml <properties> <!-- 這裡填jdk的版本,我使用的是jkd13 --> <maven.compiler.target>13</maven.compiler.target> <maven.compiler.source>13</maven.compiler.source> </properties>

這裡我採用【解決方案一】修改全域性的配置

再編譯,編譯成功 bash $ mvn compile 在這裡插入圖片描述

3、清理(mvn clean)

```bash $ mvn clean

發現上面編譯產生的target目錄會刪掉

$ tree . ``` 在這裡插入圖片描述

4、測試(mvn test)

bash $ mvn test 在這裡插入圖片描述

5、打包(mvn package)

【溫馨提示】這裡只打包編譯好的源程式(xxx.class檔案) bash $ mvn package 在這裡插入圖片描述

6、安裝到本地倉庫(mvn install)

【溫馨提示】這裡groupid決定放在倉庫的哪個檔案下,配置\com.hello\,所以生成的包就會放在倉庫目錄的com/hello目錄下。 在這裡插入圖片描述 在這裡插入圖片描述

會經歷編譯(compile)-》測試(test)-》打包(package) -》安裝(install)的過程。

在這裡插入圖片描述

2)通過maven外掛構建專案(命令列操作)

1、構建工程(模板)

模板:

mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

示例:

2、構建java工程

bash $ mvn archetype:generate -DgroupId=com.test2022 -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false 在這裡插入圖片描述 目錄結構 在這裡插入圖片描述

3、構建web工程

bash $ mvn archetype:generate -DgroupId=com.test2022 -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false 在這裡插入圖片描述 目錄結構 在這裡插入圖片描述

3)通過IDEA建立空專案來構建maven java專案

【溫馨提示】IDEA官網下載地址:http://www.jetbrains.com/idea/

1、建立一個Empty Project

在這裡插入圖片描述 在這裡插入圖片描述

2、配置jdk

在這裡插入圖片描述

3、配置maven

File->Settings,把預設配置自帶的maven修改上面下載的版本 在這裡插入圖片描述

4、建立maven工程

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述

5、編寫測試程式碼

在這裡插入圖片描述

6、編譯構建

在這裡插入圖片描述

7、配置執行環境

在這裡插入圖片描述 配置編譯 在這裡插入圖片描述 配置清理 在這裡插入圖片描述 右上角就有兩個執行的快捷選項了 在這裡插入圖片描述

4)通過IDEA模板構建maven java專案

1、搜尋quickstart模板建立

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述

2、預設的目錄結構

會預設建立一個org.example的demo,可以刪掉 在這裡插入圖片描述

3、手動建立缺少的目錄

發現main和test裡面都沒建立resources,下面我們手動建立 在這裡插入圖片描述

4、修改目錄屬性

如果建立的是普通目錄,則可以右鍵目錄修改目錄屬性 在這裡插入圖片描述

5)通過IDEA模板構建maven java-web專案

1、搜尋webapp模板建立

在這裡插入圖片描述 在這裡插入圖片描述

2、預設目錄結構

在這裡插入圖片描述

3、手動建立沒建立的目錄

在這裡插入圖片描述 在這裡插入圖片描述

4、建立一個index.jsp檔案

在這裡插入圖片描述

5、新增tomcat外掛

在maven庫中搜索tomcat:http://mvnrepository.com/

在這裡插入圖片描述 在這裡插入圖片描述 這裡使用2.1版本的 在這裡插入圖片描述 在這裡插入圖片描述

xml <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>80</port> <path>/</path> </configuration> </plugin> </plugins> </build> 在這裡插入圖片描述

6、執行web工程

【溫馨提示】預設埠是8080,上面配置的80 在這裡插入圖片描述 發現報錯了 嚴重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

【原因&解決】是因為預設建立的web.xml配置檔案裡有spring的配置,先把這些配置刪掉就行。最後web.xml只保留如下內容: ```xml

``` 再執行 在這裡插入圖片描述 在這裡插入圖片描述

7、配置快捷執行方式

在這裡插入圖片描述 在這裡插入圖片描述

五、Maven依賴管理

1)依賴配置

依賴指當前專案執行所需的jar包,一個專案可以設定多個依賴,示例如下:

```xml

junit junit 4.12 ```

2)依賴傳遞

依賴具有傳遞性: - 間接依賴:在當前專案中通過依賴配置建立的依賴關係 - 直接依賴:被資源的資源如果依賴其它資源,當前專案間接依賴其它資源

3)依賴管理

1、依賴傳遞衝突問題

  • 路徑優先:當前依賴中出現相同的資源時,層級越深,優先順序越低,層級越淺,優先順序越高。
  • 宣告優先:當資源在相同層級被依賴時,配置順序靠前的覆蓋配置順序靠後的。
  • 特殊優先:當同級配置了相同資源的不同版本,後配置的覆蓋先配置的。

2、可選依賴

可選依賴指對外隱藏當前所依賴的資源----不透明 xml <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <!-- 配置不透明 --> <optional>true</optional> </dependency>

3、排除依賴

排除依賴指主動斷開依賴的資源,被排除的資源無需指定版本----不需要

xml <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <!-- 配置排除依賴 --> <exclusions> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </exclusion> </exclusions> </dependency>

4、依賴範圍

  • 依賴的jar預設情況可以在任何地方使用,可以通過scope標籤設定起作用範圍
  • 作用範圍
    1. 主程式範圍有效(main資料夾範圍內)
    2. 測試程式範圍有效(test資料夾範圍內)
    3. 是否參與打包(package指令範圍內)

在這裡插入圖片描述

5、依賴範圍的傳遞性

帶有依賴範圍的資源在進行傳遞時,作用範圍將受到影響

在這裡插入圖片描述

六、生命週期與外掛

1)專案構建生命週期

Maven構建生命週期描述的是一次構建過程經歷了多少的事件

在這裡插入圖片描述

2)Maven對構建的生命週期劃分三個階段

  • clean:清理工作
  • default:核心工作,例如編譯、測試、打包、部署等。
  • site:產生報告,釋出站點等。

1、clean生命週期

  • pre-clean:執行一些需要在clean之前完成的工作
  • clean:移除所有上一次構建生成的檔案
  • post-clean:執行一些需要在clean之後立刻完成的工作

2、default構建生命週期

  • 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 (部署):將最終的專案包複製到遠端倉庫中與其他開發者和專案共享。

【溫馨提示】:像compile、test、test-compile、package、install等,排在它們前面的步驟都會執行。圖示如下:

在這裡插入圖片描述

3、site構建的生命週期

  • pre-site:執行一些需要在生成站點文件之前完成的工作
  • site:生成專案的站點文件
  • post-site:執行一些需要在生成站點文件之後完成的工作,並且為部署做準備
  • site-deploy:將生成的站點文件部署到特殊的伺服器上

3)外掛

外掛與生命週期內的階段繫結,在執行到對應生命週期時執行對應的外掛功能,預設maven在各個生命週期上繫結有預設的功能,通過外掛可以自定義其他功能。

xml <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>

七、工程版本管理

  • SNAPSHOT (快照版本)

    專案開發過程中,為方便團隊成員合作,解決模組間相互依賴和時時更新的問題,開發者對每個模組進行構建的時候,輸出的臨時性版本叫快照版本(測試階段版本),快照版本會隨著開發的進展不斷更新。

  • RELEASE (釋出版本)

    專案開發到進入階段里程碑後,向團隊外部發布較為穩定的版本,這種版本所對應的構件檔案是穩定的,即便進行功能的後續開發,也不會改變當前釋出版本內容,這種版本稱為釋出版本。

工程版本號約定規範:

【版本格式】<主版本>.< 次版本>..<里程碑版本> - 主版本:表示專案重大架構的變更,如:spring5相較於spring4的迭代 - 次版本:表示有較大的功能增加和變化,或者全面系統地修復漏洞 - 增量版本:表示有重大漏洞的修復 - 里程碑版本:表明一個版本的里程碑(版本內部)。這樣的版本同下一個正式版本相比,相對來說不是很穩定,有待更多的測試。

【範例】

5.1.9.RELEASE或5.1.9-RELEASE

八、多環境資源配置

一般公司至少有三套環境(開發、測試、生產),如果每次把程式打包好上傳到對應的環境之前就得更改一下配置,是很煩的操作,所以就有了這裡的多環境資源配置了。 在這裡插入圖片描述 示例:

```xml

dev test pro jdbc:mysql://127.1.1.1:3306/ssm_db true ``` 通過命令載入指定環境

【呼叫格式】mvn 指令 -P 環境定義id

【示例】

bash $ mvn install -P pro

九、跳過測試

1)跳過測試環節的應用場景

  • 整體模組功能未開發
  • 模組中某個功能未開發完畢
  • 單個功能更新除錯導致其他功能失敗
  • 快速打包

2)跳過測試的兩種方法

  • 使用命令跳過測試

    【呼叫格式】mvn 指令 –D skipTests

  • 使用配置跳過測試

xml <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>