實(shí)戰(zhàn)講解Maven安裝及基本使用詳解
前言
Apache Maven
,是一個(gè)跨平臺(tái)的軟件項(xiàng)目管理及自動(dòng)構(gòu)建工具,由Apache軟件基金會(huì)所提供。Maven
主要服務(wù)于基于Java
平臺(tái)的項(xiàng)目構(gòu)建、依賴管理和項(xiàng)目信息管理。Maven
的目標(biāo)是能夠讓開發(fā)者在最短的時(shí)間內(nèi)了解項(xiàng)目開發(fā)工作的完整狀態(tài),主要包括以下幾個(gè)方面:
•簡(jiǎn)化項(xiàng)目構(gòu)建過程
•提供一個(gè)統(tǒng)一的項(xiàng)目構(gòu)建系統(tǒng)
•通過POM(project object model)提供一個(gè)項(xiàng)目的重要信息
•為最佳項(xiàng)目開發(fā)實(shí)踐提供一個(gè)指導(dǎo)方針
接下來本文就通過Maven
的安裝、基本的指令使用和一個(gè)實(shí)際的小例子來帶你對(duì)Maven
的使用有一個(gè)大體的認(rèn)識(shí)。此外,本文的樣例基于JDK1.8
和Maven3
。
環(huán)境準(zhǔn)備
在安裝Maven
之前,首先要確保本地已安裝JDK
并配置好了JAVA_HOME
環(huán)境變量,可以在cmd
通過以下命令進(jìn)行驗(yàn)證:
echo %JAVA_HOME% # 輸出 JAVA_HOME 環(huán)境變量值 java -version # 輸出 Java 版本信息
如果正常輸出了JDK
的安裝路徑及java
的版本信息,那么就可以開始進(jìn)行下一步了,否則,你可能需要先到官網(wǎng)下載一個(gè)JDK
,并按照下圖所示配置好環(huán)境變量:
安裝Maven
在確認(rèn)本地已安裝好了JDK
并配置了環(huán)境變量后,我們就可以開始安裝Maven
了,首先找到官網(wǎng),然后找到安裝包下載即可,本文以 3.6.3 版本為例:
在下載完成后,解壓到本地文件夾即可,以我為例,我解壓在 D 盤:
在解壓完畢后,我們先進(jìn)行環(huán)境變量的配置,配置一個(gè)名為M2_HOME
的環(huán)境變量,對(duì)應(yīng)值為個(gè)人的Maven
文件夾位置:
然后在Path
系統(tǒng)變量中配置%M2_HOME%\bin
即可:
在配置完成并保存后,重新打開cmd
,輸入以下命令進(jìn)行驗(yàn)證,如果均得到正確信息,便表明已經(jīng)安裝成功:
echo %M2_HOME% # 輸出 Maven 的安裝位置 mvn -v # 輸出 Maven 的版本信息
注意
你可能會(huì)疑惑為什么我們下載了Maven3
卻要配置一個(gè)名為M2_HOME
的環(huán)境變量,這主要是因?yàn)樵?code>Maven1時(shí)環(huán)境變量配置為MAVEN_HOME
,在Maven2
時(shí)改為了M2_HOME
,而在Maven3
則繼續(xù)沿用了這個(gè)命名,不過在Maven3.5.0
以后,官方也舍棄了M2_HOME
,因此我們現(xiàn)在其實(shí)只需要在Path
中配置D:\apache-maven-3.6.3\bin
即可,不過本文依舊沿用了M2_HOME
。
安裝目錄介紹
在正式講解Maven
的使用之前,我們先熟悉一下Maven
的安裝目錄中各個(gè)文件夾的內(nèi)容及作用(基于Maven3.6.3
版本):
bin
該文件夾下包含了mvn
運(yùn)行的腳本,這些腳本用來配置Java
命令,準(zhǔn)備好classpath
和相關(guān)的Java
系統(tǒng)屬性,然后執(zhí)行Java命令。其中mvn
是基于UNIX
平臺(tái)的shell
腳本,mvn.cmd
是基于Windows
平臺(tái)的下的運(yùn)行腳本。當(dāng)我們?cè)诿钚兄休斎胍粭lmvn
命令時(shí),其實(shí)就是在調(diào)用這些腳本。此外該文件夾中還包含了mvnDebug
和mvnDebug.cmd
這兩個(gè)文件,該腳本包含了mvn
腳本所有的功能,只是多了一條MAVEN_DEBUG_OPTS
的配置,用于調(diào)試Maven
。除此之外,該文件夾內(nèi)還包含了m2.conf
和mvnyjp
文件,其中m2.conf
是classworlds
的配置文件,而mvnyjp
則是為了配合Yourkit profiler
的使用,關(guān)于classworlds
和Yourkit profiler
,本文不做介紹,感興趣可以自行查找資料。
boot
該文件夾下只有一個(gè)plexus-classworlds
的jar
包和其相關(guān)的license
文件,plexus-classworlds
是一個(gè)類加載框架,Maven
使用該框架來加載自己的類庫。
conf
該文件下包含了一個(gè)我們以后接觸最多的settings.xml
文件,主要用于配置代理、鏡像和插件等。
此外還包含了一個(gè)toolchains.xml
配置文件和一個(gè)logging
文件夾,其中toolchains.xml
主要是為了方便我們指定項(xiàng)目所使用的JDK
版本,需要配置maven-toolchains-plugin
插件一起使用,而logging
文件夾(內(nèi)含一個(gè)名為simplelogger.properties
的配置文件)則用于配置我們?cè)谑褂?code>Maven時(shí)的日志。
lib
該文件夾下包含了所有Maven
在運(yùn)行時(shí)所需要的一些庫文件,這里就不做具體介紹了。
其它
此外還有LICENSE
、NOTICE
、README.txt
用于說明開源協(xié)議和簡(jiǎn)單介紹的文件。
實(shí)戰(zhàn)演練
下面我們就開始通過一個(gè)實(shí)際小案例來說明Maven
的基本使用,為了加深對(duì)Maven
中配置文件和基本指令的學(xué)習(xí),我們就不使用IDEA
等集成Maven
的IDE
了,直接使用VS CODE
來進(jìn)行接下來案例的講解。
首先,我們先創(chuàng)建一個(gè)名為maven
的文件夾,然后通過VS CODE
打開,新建一個(gè)名為pom.xml
的文件夾,并在其中輸入以下內(nèi)容:
<?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>
下面對(duì)該文件中的內(nèi)容進(jìn)行簡(jiǎn)單介紹:
文件的第一行是XML
頭,就像HTML
中也有<!DOCTYPE html>
頭為了告訴標(biāo)準(zhǔn)通用標(biāo)記語言解析器如何解析文檔一般,在XML
這里主要是為了指定文檔的版本和編碼方式。緊接著是project
,主要聲明了一些POM
相關(guān)的命名空間和xsd
元素,可以方便我們?cè)谑褂?code>IDE時(shí)編輯XML
文檔。在project
這個(gè)根元素下還有四個(gè)同級(jí)的元素,下面再一一介紹:
- modelVersion:制定了當(dāng)前POM模型的版本,對(duì)于Maven2和Maven3來說,這個(gè)值固定為 4.0.0。
- groupId:定義了項(xiàng)目屬于哪個(gè)組,一般都是對(duì)應(yīng)公司或組織的域名反寫并加上項(xiàng)目名,例如公司域名為abc.com,項(xiàng)目名為demo,那么groupId就是com.abc.demo。
- artifactId:定義了在當(dāng)前Maven項(xiàng)目中的唯一的ID,當(dāng)項(xiàng)目包含多個(gè)子項(xiàng)目時(shí),我們就需要特別注意命名方式。
- version:指定了當(dāng)前項(xiàng)目的版本,SNAPSHOT意思是快照,即代表當(dāng)前項(xiàng)目屬于不穩(wěn)定的版本。
- name:聲明了一個(gè)讓用戶更容易理解的項(xiàng)目名稱,改元素屬于可選項(xiàng)。
然后,我們就開始正式編寫項(xiàng)目的主代碼,我們首先按照Maven
規(guī)范,在maven
文件夾下創(chuàng)建一個(gè)src/main/java
目錄,然后在該目錄下再根據(jù)我們?cè)?code>XML中groupId
和artifactId
的命名,創(chuàng)建文件:com/butterfly/maven/demo/Sum.java
,并寫入以下內(nèi)容:
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})); } }
然后在項(xiàng)目的根目錄下執(zhí)行mvn clean compile
命令進(jìn)行編譯,可以得到以下輸出(第一次執(zhí)行會(huì)下載很多插件依賴,下面輸出中省略了這些下載輸出):
[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
編譯項(xiàng)目主代碼,從上面的輸出中也可以看出Maven
首先執(zhí)行了maven-clean-plugin:2.5:clean
進(jìn)行刪除了target
目錄,然后執(zhí)行了maven-resources-plugin:2.6:resources
,由于項(xiàng)目中不存在resources
文件,因此跳過了,最后執(zhí)行了maven-compiler-plugin:3.1:compile
對(duì)主代碼進(jìn)行編譯,并將編譯的結(jié)果放到target/classes
目錄下,如下圖所示:
接下來,我們?cè)倬帉憸y(cè)試的代碼,首先我們依舊按照Maven
規(guī)范,在src/
目錄下繼續(xù)創(chuàng)建test/java
目錄,然后在編寫正式的測(cè)試代碼之前,讓我們先引入JUnit
的依賴,我們需要將pom.xml
進(jìn)行如下修改:
<!-- 添加在 project 根元素下 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> </dependencies>
然后我們就可以編寫我們的測(cè)試代碼了,我們?cè)?code>src/test/java/目錄下,創(chuàng)建demo/SumTest.java
文件,并寫入以下內(nèi)容:
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})); } }
然后我們?cè)诟夸浵麻_啟終端,并運(yùn)行mvn clean test
指令(第一次運(yùn)行同樣會(huì)下載一些插件,這里也省略了這些下載輸出),可以在終端中得到以下信息:
[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] ------------------------------------------------------------------------
根據(jù)輸出可以發(fā)現(xiàn),執(zhí)行mvn clean test
同樣也執(zhí)行了mvn clean compile
中的clean
、resources
、compile
這三個(gè)指定,不同的是,這里還多了對(duì)測(cè)試包中進(jìn)行的三個(gè)操作,分別是testResources
、testCompile
和test
,隨后打印了執(zhí)行單元測(cè)試后的輸出,可以發(fā)現(xiàn)執(zhí)行了一個(gè)測(cè)試(即為我們建立的testSum
測(cè)試方法),并且沒有失敗的測(cè)試。
注意
對(duì)于不同版本的Maven
,在第一次執(zhí)行上述操作的時(shí)候,可能會(huì)有關(guān)于JDK
版本方面的報(bào)錯(cuò),提示我們編譯版本過低,這時(shí)就需要在pom.xml
中添加如下配置:
<!-- 添加在 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
在安裝依賴時(shí),默認(rèn)是從國外網(wǎng)址下載,因此為了加快下載速度,我們需要配置國內(nèi)的鏡像,這時(shí)我們就需要對(duì)settings.xml
文件進(jìn)行修改,這里建議在修改之前做一個(gè)備份。打開settings.xml
后,通過查找找到mirrors
標(biāo)簽,然后在內(nèi)部添加如下配置即可:
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
還有一點(diǎn)需要注意的是,所有的依賴包默認(rèn)下載的位置是~/.m2/repository
,這里的~
代表的個(gè)人的用戶目錄,對(duì)我而言就是對(duì)應(yīng)C:/Users/zjw/.m2/repository
。因此,如果不想將jar
包放在 C 盤,就需要和mirrors
同級(jí),然后加入以下配置:
<localRepository>D:/jar</localRepository>
這樣,所有的依賴都會(huì)保存在D:/jar
目錄下了。
打包及運(yùn)行
在Maven
里,我們只要通過mvn clean package
命令就可以對(duì)項(xiàng)目進(jìn)行打包了(默認(rèn)打包類型為jar
),我們?cè)?code>cmd中輸入以上指令,可以得到下面的輸出(省略了和以上指令中相同的前幾個(gè)輸出):
[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
執(zhí)行完畢后,我們就可以在target/
目錄下發(fā)現(xiàn)我們生成的jar
包了。此外,如果我們想要像引用其它jar
包一樣,在其它的項(xiàng)目中引入我們自己的jar
包也是可以的,但是如果每次都要將jar
包一個(gè)一個(gè)地復(fù)制到其他項(xiàng)目中是非常麻煩的,但是通過Maven
,我們只需要一個(gè)mvn clean install
命令就可以將當(dāng)前項(xiàng)目的jar
包安裝到本地倉庫:
可以發(fā)現(xiàn)和mvn clean package
相比,又多了如下幾行輸出:
[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/
目錄下,我們可以打開文件資源管理器進(jìn)行驗(yàn)證:
這樣,我們就可以在其它項(xiàng)目中,通過以下配置來引用我們自己的jar
包了:
<dependency> <groupId>com.butterfly.maven</groupId> <artifactId>demo</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
不過,到目前為止,我們?nèi)匀粵]有運(yùn)行主代碼中的main
函數(shù)部分,由于默認(rèn)生成的jar
包中缺少manifest
配置,因此上文生成的jar
包并沒有辦法直接運(yùn)行,為了生成能夠執(zhí)行的jar
包,我們還需要在pom.xml
加入以下配置:
<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>
再次執(zhí)行mvn clean install
命令,可以發(fā)現(xiàn)target/
目錄下有兩個(gè)jar
包:
其中orgin
開頭的jar
包則對(duì)用我們之前無法直接執(zhí)行的jar
包,另外一個(gè)則是可以直接執(zhí)行的,我們可以進(jìn)行測(cè)試:
大功告成!
總結(jié)
本文簡(jiǎn)單介紹了Maven
,并講解了Maven
的安裝和幾個(gè)基本的命令的使用,在之后我還會(huì)繼續(xù)講解Maven
其他方面的知識(shí),希望能夠?qū)δ阌兴鶐椭?/p>
參考資料
https://maven.apache.org/what-is-maven.html
到此這篇關(guān)于實(shí)戰(zhàn)講解Maven安裝及基本使用詳解的文章就介紹到這了,更多相關(guān)Maven安裝及基本使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中使用JeecgBoot的Autopoi導(dǎo)出Excel的方法步驟
- Java如何通過Maven管理項(xiàng)目依賴
- springboot maven 項(xiàng)目打包jar 最后名稱自定義的教程
- 在IDEA中安裝scala、maven、hadoop遇到的問題小結(jié)
- 修改Maven settings.xml 后配置未生效的解決
- 解決idea2020.2遇到pom.xml文件報(bào)錯(cuò)maven插件tomcat7的問題
- IDEA2020.2創(chuàng)建springboot項(xiàng)目卡死在reading maven project的問題
- Maven腳手架如何基于jeecg實(shí)現(xiàn)快速開發(fā)
相關(guān)文章
Java使用建造者模式實(shí)現(xiàn)辦理手機(jī)套餐功能詳解
這篇文章主要介紹了Java使用建造者模式實(shí)現(xiàn)辦理手機(jī)套餐功能,較為詳細(xì)的描述了建造者模式的概念、原理并結(jié)合實(shí)例形式分析了Java使用建造者模式實(shí)現(xiàn)的辦理手機(jī)套餐功能具體步驟與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-05-05Spring init-method與destroy-method屬性的用法解析
這篇文章主要介紹了Spring init-method與destroy-method屬性的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08解決springmvc項(xiàng)目中使用過濾器來解決請(qǐng)求方式為post時(shí)出現(xiàn)亂碼的問題
這篇文章主要介紹了springmvc項(xiàng)目中使用過濾器來解決請(qǐng)求方式為post時(shí)出現(xiàn)亂碼的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08通過實(shí)例解析Spring Ioc項(xiàng)目實(shí)現(xiàn)過程
這篇文章主要介紹了Spring Ioc項(xiàng)目實(shí)踐過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java中的三種校驗(yàn)注解的使用(@Valid,@Validated和@PathVariable)
本文主要介紹了Java中的三種校驗(yàn)注解的使用(@Valid,@Validated和@PathVariable),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04詳解IDEA社區(qū)版(Community)和付費(fèi)版(UItimate)的區(qū)別
這篇文章主要介紹了詳解IDEA社區(qū)版(Community)和付費(fèi)版(UItimate)的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Web容器啟動(dòng)過程中如何執(zhí)行Java類
這篇文章主要介紹了Web容器啟動(dòng)過程中如何執(zhí)行Java類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10SpringBoot項(xiàng)目從18.18M瘦身到0.18M的實(shí)現(xiàn)
本文主要介紹了SpringBoot項(xiàng)目從18.18M瘦身到0.18M的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01