時間:2020-10-06來源:www.farandoo.com作者:電腦系統城
前言
Apache Maven
,是一個跨平臺的軟件項目管理及自動構建工具,由Apache軟件基金會所提供。Maven
主要服務于基于Java
平臺的項目構建、依賴管理和項目信息管理。Maven
的目標是能夠讓開發者在最短的時間內了解項目開發工作的完整狀態,主要包括以下幾個方面:
•簡化項目構建過程
•提供一個統一的項目構建系統
•通過POM(project object model)提供一個項目的重要信息
•為最佳項目開發實踐提供一個指導方針
接下來本文就通過Maven
的安裝、基本的指令使用和一個實際的小例子來帶你對Maven
的使用有一個大體的認識。此外,本文的樣例基于JDK1.8
和Maven3
。
環境準備
在安裝Maven
之前,首先要確保本地已安裝JDK
并配置好了JAVA_HOME
環境變量,可以在cmd
通過以下命令進行驗證:
1 2 |
echo %JAVA_HOME% # 輸出 JAVA_HOME 環境變量值 java -version # 輸出 Java 版本信息 |
如果正常輸出了JDK
的安裝路徑及java
的版本信息,那么就可以開始進行下一步了,否則,你可能需要先到官網下載一個JDK
,并按照下圖所示配置好環境變量:
安裝Maven
在確認本地已安裝好了JDK
并配置了環境變量后,我們就可以開始安裝Maven
了,首先找到官網,然后找到安裝包下載即可,本文以 3.6.3 版本為例:
在下載完成后,解壓到本地文件夾即可,以我為例,我解壓在 D 盤:
在解壓完畢后,我們先進行環境變量的配置,配置一個名為M2_HOME
的環境變量,對應值為個人的Maven
文件夾位置:
然后在Path
系統變量中配置%M2_HOME%\bin
即可:
在配置完成并保存后,重新打開cmd
,輸入以下命令進行驗證,如果均得到正確信息,便表明已經安裝成功:
1 2 |
echo %M2_HOME% # 輸出 Maven 的安裝位置 mvn -v # 輸出 Maven 的版本信息 |
注意
你可能會疑惑為什么我們下載了Maven3
卻要配置一個名為M2_HOME
的環境變量,這主要是因為在Maven1
時環境變量配置為MAVEN_HOME
,在Maven2
時改為了M2_HOME
,而在Maven3
則繼續沿用了這個命名,不過在Maven3.5.0
以后,官方也舍棄了M2_HOME
,因此我們現在其實只需要在Path
中配置D:\apache-maven-3.6.3\bin
即可,不過本文依舊沿用了M2_HOME
。
安裝目錄介紹
在正式講解Maven
的使用之前,我們先熟悉一下Maven
的安裝目錄中各個文件夾的內容及作用(基于Maven3.6.3
版本):
bin
該文件夾下包含了mvn
運行的腳本,這些腳本用來配置Java
命令,準備好classpath
和相關的Java
系統屬性,然后執行Java命令。其中mvn
是基于UNIX
平臺的shell
腳本,mvn.cmd
是基于Windows
平臺的下的運行腳本。當我們在命令行中輸入一條mvn
命令時,其實就是在調用這些腳本。此外該文件夾中還包含了mvnDebug
和mvnDebug.cmd
這兩個文件,該腳本包含了mvn
腳本所有的功能,只是多了一條MAVEN_DEBUG_OPTS
的配置,用于調試Maven
。除此之外,該文件夾內還包含了m2.conf
和mvnyjp
文件,其中m2.conf
是classworlds
的配置文件,而mvnyjp
則是為了配合Yourkit profiler
的使用,關于classworlds
和Yourkit profiler
,本文不做介紹,感興趣可以自行查找資料。
boot
該文件夾下只有一個plexus-classworlds
的jar
包和其相關的license
文件,plexus-classworlds
是一個類加載框架,Maven
使用該框架來加載自己的類庫。
conf
該文件下包含了一個我們以后接觸最多的settings.xml
文件,主要用于配置代理、鏡像和插件等。
此外還包含了一個toolchains.xml
配置文件和一個logging
文件夾,其中toolchains.xml
主要是為了方便我們指定項目所使用的JDK
版本,需要配置maven-toolchains-plugin
插件一起使用,而logging
文件夾(內含一個名為simplelogger.properties
的配置文件)則用于配置我們在使用Maven
時的日志。
lib
該文件夾下包含了所有Maven
在運行時所需要的一些庫文件,這里就不做具體介紹了。
其它
此外還有LICENSE
、NOTICE
、README.txt
用于說明開源協議和簡單介紹的文件。
實戰演練
下面我們就開始通過一個實際小案例來說明Maven
的基本使用,為了加深對Maven
中配置文件和基本指令的學習,我們就不使用IDEA
等集成Maven
的IDE
了,直接使用VS CODE
來進行接下來案例的講解。
首先,我們先創建一個名為maven
的文件夾,然后通過VS CODE
打開,新建一個名為pom.xml
的文件夾,并在其中輸入以下內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<? 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/xsd/maven-4.0.0.xsd"> < modelVersion >4.0.0</ modelVersion > < groupId >com.butterfly.maven</ groupId > < artifactId >demo</ artifactId > < version >1.0-SNAPSHOT</ version > <!-- 可選 --> < name >a demo maven project</ name > </ project > |
下面對該文件中的內容進行簡單介紹:
文件的第一行是XML
頭,就像HTML
中也有<!DOCTYPE html>
頭為了告訴標準通用標記語言解析器如何解析文檔一般,在XML
這里主要是為了指定文檔的版本和編碼方式。緊接著是project
,主要聲明了一些POM
相關的命名空間和xsd
元素,可以方便我們在使用IDE
時編輯XML
文檔。在project
這個根元素下還有四個同級的元素,下面再一一介紹:
然后,我們就開始正式編寫項目的主代碼,我們首先按照Maven
規范,在maven
文件夾下創建一個src/main/java
目錄,然后在該目錄下再根據我們在XML
中groupId
和artifactId
的命名,創建文件:com/butterfly/maven/demo/Sum.java
,并寫入以下內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.butterfly.maven.demo; public class Sum { private static int sum( int [] arr) { int sum = 0 ; for ( int val : arr) { sum += val; } return sum; } public static void main(String[] args) { System.out.println(sum( new int []{ 1 , 3 , 5 , 7 , 9 })); } } |
然后在項目的根目錄下執行mvn clean compile
命令進行編譯,可以得到以下輸出(第一次執行會下載很多插件依賴,下面輸出中省略了這些下載輸出):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[INFO] Scanning for projects... [INFO] [INFO] ----------------------< com.butterfly.maven:demo >---------------------- [INFO] Building a demo maven project 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ demo --- [INFO] Deleting D:\Temp\maven\target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo --- [INFO] skip non existing resourceDirectory D:\Temp\maven\src\main\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to D:\Temp\maven\target\classes [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.975 s [INFO] Finished at: 2020-10-02T21:27:55+08:00 [INFO] ------------------------------------------------------------------------ |
其中clean
用于告訴Maven
清理輸出目錄target/
,compile
告訴Maven
編譯項目主代碼,從上面的輸出中也可以看出Maven
首先執行了maven-clean-plugin:2.5:clean
進行刪除了target
目錄,然后執行了maven-resources-plugin:2.6:resources
,由于項目中不存在resources
文件,因此跳過了,最后執行了maven-compiler-plugin:3.1:compile
對主代碼進行編譯,并將編譯的結果放到target/classes
目錄下,如下圖所示:
接下來,我們再編寫測試的代碼,首先我們依舊按照Maven
規范,在src/
目錄下繼續創建test/java
目錄,然后在編寫正式的測試代碼之前,讓我們先引入JUnit
的依賴,我們需要將pom.xml
進行如下修改:
1 2 3 4 5 6 7 8 9 |
<!-- 添加在 project 根元素下 --> < dependencies > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >4.13</ version > < scope >test</ scope > </ dependency > </ dependencies > |
然后我們就可以編寫我們的測試代碼了,我們在src/test/java/
目錄下,創建demo/SumTest.java
文件,并寫入以下內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package demo; import org.junit.Test; import static com.butterfly.maven.demo.Sum.sum; import static org.junit.Assert.assertEquals; public class SumTest { @Test public void testSum() { assertEquals( 10 , sum( new int []{ 1 , 2 , 3 , 4 })); } } |
然后我們在根目錄下開啟終端,并運行mvn clean test
指令(第一次運行同樣會下載一些插件,這里也省略了這些下載輸出),可以在終端中得到以下信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
[INFO] Scanning for projects... [INFO] [INFO] ----------------------< com.butterfly.maven:demo >---------------------- [INFO] Building a demo maven project 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ demo --- [INFO] Deleting D:\Temp\maven\target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo --- [INFO] skip non existing resourceDirectory D:\Temp\maven\src\main\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to D:\Temp\maven\target\classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ demo --- [INFO] skip non existing resourceDirectory D:\Temp\maven\src\test\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ demo --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to D:\Temp\maven\target\test-classes [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ demo --- [INFO] Surefire report directory: D:\Temp\maven\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running demo.SumTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.091 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.166 s [INFO] Finished at: 2020-10-02T22:17:30+08:00 [INFO] ------------------------------------------------------------------------ |
根據輸出可以發現,執行mvn clean test
同樣也執行了mvn clean compile
中的clean
、resources
、compile
這三個指定,不同的是,這里還多了對測試包中進行的三個操作,分別是testResources
、testCompile
和test
,隨后打印了執行單元測試后的輸出,可以發現執行了一個測試(即為我們建立的testSum
測試方法),并且沒有失敗的測試。
注意
對于不同版本的Maven
,在第一次執行上述操作的時候,可能會有關于JDK
版本方面的報錯,提示我們編譯版本過低,這時就需要在pom.xml
中添加如下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!-- 添加在 project 根元素下 --> < build > < plugins > < plugin > < groupId >org.apache.maven.plugins</ groupId > < artifactId >maven-compiler-plugin</ artifactId > < configuration > < source >1.8</ source > < target >1.8</ target > </ configuration > </ plugin > </ plugins > </ build > |
此外,由于Maven
在安裝依賴時,默認是從國外網址下載,因此為了加快下載速度,我們需要配置國內的鏡像,這時我們就需要對settings.xml
文件進行修改,這里建議在修改之前做一個備份。打開settings.xml
后,通過查找找到mirrors
標簽,然后在內部添加如下配置即可:
1 2 3 4 5 6 |
< mirror > < id >alimaven</ id > < name >aliyun maven</ name > < url >http://maven.aliyun.com/nexus/content/groups/public/</ url > < mirrorOf >central</ mirrorOf > </ mirror > |
還有一點需要注意的是,所有的依賴包默認下載的位置是~/.m2/repository
,這里的~
代表的個人的用戶目錄,對我而言就是對應C:/Users/zjw/.m2/repository
。因此,如果不想將jar
包放在 C 盤,就需要和mirrors
同級,然后加入以下配置:
1 | < localRepository >D:/jar</ localRepository > |
這樣,所有的依賴都會保存在D:/jar
目錄下了。
打包及運行
在Maven
里,我們只要通過mvn clean package
命令就可以對項目進行打包了(默認打包類型為jar
),我們在cmd
中輸入以上指令,可以得到下面的輸出(省略了和以上指令中相同的前幾個輸出):
1 2 3 4 5 |
[INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ demo --- [INFO] Building jar: D:\Temp\maven\target\demo-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS |
執行完畢后,我們就可以在target/
目錄下發現我們生成的jar
包了。此外,如果我們想要像引用其它jar
包一樣,在其它的項目中引入我們自己的jar
包也是可以的,但是如果每次都要將jar
包一個一個地復制到其他項目中是非常麻煩的,但是通過Maven
,我們只需要一個mvn clean install
命令就可以將當前項目的jar
包安裝到本地倉庫:
可以發現和mvn clean package
相比,又多了如下幾行輸出:
1 2 3 |
[INFO] --- maven-install-plugin:2.4:install (default-install) @ demo --- [INFO] Installing D:\Temp\maven\target\demo-1.0-SNAPSHOT.jar to D:\jar\com\butterfly\maven\demo\1.0-SNAPSHOT\demo-1.0-SNAPSHOT.jar [INFO] Installing D:\Temp\maven\pom.xml to D:\jar\com\butterfly\maven\demo\1.0-SNAPSHOT\demo-1.0-SNAPSHOT.pom |
按照信息,我們可以知道,我們生成的jar
包被保存在了D:/jar/com/butterfly/maven/demo/1.0-SNAPSHOT/
目錄下,我們可以打開文件資源管理器進行驗證:
這樣,我們就可以在其它項目中,通過以下配置來引用我們自己的jar
包了:
1 2 3 4 5 |
< dependency > < groupId >com.butterfly.maven</ groupId > < artifactId >demo</ artifactId > < version >1.0-SNAPSHOT</ version > </ dependency > |
不過,到目前為止,我們仍然沒有運行主代碼中的main
函數部分,由于默認生成的jar
包中缺少manifest
配置,因此上文生成的jar
包并沒有辦法直接運行,為了生成能夠執行的jar
包,我們還需要在pom.xml
加入以下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
< plugin > < groupId >org.apache.maven.plugins</ groupId > < artifactId >maven-shade-plugin</ artifactId > < version >1.2.1</ version > < executions > < execution > < phase >package</ phase > < goals > < goal >shade</ goal > </ goals > < configuration > < transformers > < transformer implementation="org.apache.maven.plugins. shade.resource.ManifestResourceTransformer"> < mainClass >com.butterfly.maven.demo.Sum</ mainClass > </ transformer > </ transformers > </ configuration > </ execution > </ executions > </ plugin > |
再次執行mvn clean install
命令,可以發現target/
目錄下有兩個jar
包:
其中orgin
開頭的jar
包則對用我們之前無法直接執行的jar
包,另外一個則是可以直接執行的,我們可以進行測試:
大功告成!
總結
本文簡單介紹了Maven
,并講解了Maven
的安裝和幾個基本的命令的使用,在之后我還會繼續講解Maven
其他方面的知識,希望能夠對你有所幫助。
2020-11-11
Vue3 響應式偵聽與計算的實現2020-10-19
詳解mybatis-plus配置找不到Mapper接口路徑的坑2020-10-19
SpringBoot下使用MyBatis-Puls代碼生成器的方法