Jave-Maven詳解
一、什麼是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
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
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標籤設定起作用範圍
- 作用範圍
- 主程式範圍有效(main資料夾範圍內)
- 測試程式範圍有效(test資料夾範圍內)
- 是否參與打包(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
【呼叫格式】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>
- 企業級日誌系統架構——ELK(Elasticsearch、Filebeat、Kafka、Logstash、Kibana)
- Kubernetes(k8s)許可權管理RBAC詳解
- Kubernetes(k8s)kube-proxy、Service詳解
- Linux防火牆——Firewalld原理與實戰操作
- Kubernetes(k8s)基礎概念介紹
- 大資料Hadoop之——資料分析引擎Apache Pig
- 大資料Hadoop之——任務排程器Azkaban(Azkaban環境部署)
- 大資料Hadoop之——Flink的狀態管理和容錯機制(checkpoint)
- 大資料Hadoop之——實時計算流計算引擎Flink(Flink環境部署)
- Jave-Maven詳解
- 大資料Hadoop之——Spark Streaming原理
- 大資料Hadoop生態系統介紹
- 導航軟體怎麼知道這條路堵車?老司機硬核吹牛科普知識
- 太強大!發現一個老司機專用資料分析神器!
- 網易資料分析高階總監:10年資料分析老司機的深度思考
- 導航軟體怎麼知道這條路堵車?老司機硬核吹牛科普知識