1. 程式人生 > 程式設計 >實戰講解Maven安裝及基本使用詳解

實戰講解Maven安裝及基本使用詳解

前言

Apache Maven,是一個跨平臺的軟體專案管理及自動構建工具,由Apache軟體基金會所提供。Maven主要服務於基於Java平臺的專案構建、依賴管理和專案資訊管理。Maven的目標是能夠讓開發者在最短的時間內瞭解專案開發工作的完整狀態,主要包括以下幾個方面:

•簡化專案構建過程
•提供一個統一的專案構建系統
•通過POM(project object model)提供一個專案的重要資訊
•為最佳專案開發實踐提供一個指導方針

接下來本文就通過Maven的安裝、基本的指令使用和一個實際的小例子來帶你對Maven的使用有一個大體的認識。此外,本文的樣例基於JDK1.8

Maven3

環境準備

在安裝Maven之前,首先要確保本地已安裝JDK並配置好了JAVA_HOME環境變數,可以在cmd通過以下命令進行驗證:

echo %JAVA_HOME%  # 輸出 JAVA_HOME 環境變數值
java -version    # 輸出 Java 版本資訊

如果正常輸出了JDK的安裝路徑及java的版本資訊,那麼就可以開始進行下一步了,否則,你可能需要先到官網下載一個JDK,並按照下圖所示配置好環境變數:

image-20201002192234454

安裝Maven

在確認本地已安裝好了JDK並配置了環境變數後,我們就可以開始安裝Maven了,首先找到官網,然後找到安裝包下載即可,本文以 3.6.3 版本為例:

image-20201002192643626

在下載完成後,解壓到本地資料夾即可,以我為例,我解壓在 D 盤:

image-20201002192823076

在解壓完畢後,我們先進行環境變數的配置,配置一個名為M2_HOME的環境變數,對應值為個人的Maven資料夾位置:

image-20201002193034042

然後在Path系統變數中配置%M2_HOME%\bin即可:

image-20201002193354728

在配置完成並儲存後,重新開啟cmd,輸入以下命令進行驗證,如果均得到正確資訊,便表明已經安裝成功:

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版本):

image-20201002195354101

bin

該資料夾下包含了mvn執行的指令碼,這些指令碼用來配置Java命令,準備好classpath和相關的Java系統屬性,然後執行Java命令。其中mvn是基於UNIX平臺的shell指令碼,mvn.cmd是基於Windows平臺的下的執行指令碼。當我們在命令列中輸入一條mvn命令時,其實就是在呼叫這些指令碼。此外該資料夾中還包含了mvnDebugmvnDebug.cmd這兩個檔案,該指令碼包含了mvn指令碼所有的功能,只是多了一條MAVEN_DEBUG_OPTS的配置,用於除錯Maven。除此之外,該資料夾內還包含了m2.confmvnyjp檔案,其中m2.confclassworlds的配置檔案,而mvnyjp則是為了配合Yourkit profiler的使用,關於classworldsYourkit profiler,本文不做介紹,感興趣可以自行查詢資料。

boot

該資料夾下只有一個plexus-classworldsjar包和其相關的license檔案,plexus-classworlds是一個類載入框架,Maven使用該框架來載入自己的類庫。

conf

該檔案下包含了一個我們以後接觸最多的settings.xml檔案,主要用於配置代理、映象和外掛等。

此外還包含了一個toolchains.xml配置檔案和一個logging資料夾,其中toolchains.xml主要是為了方便我們指定專案所使用的JDK版本,需要配置maven-toolchains-plugin外掛一起使用,而logging資料夾(內含一個名為simplelogger.properties的配置檔案)則用於配置我們在使用Maven時的日誌。

lib

該資料夾下包含了所有Maven在執行時所需要的一些庫檔案,這裡就不做具體介紹了。

其它

此外還有LICENSENOTICEREADME.txt用於說明開源協議和簡單介紹的檔案。

實戰演練

下面我們就開始通過一個實際小案例來說明Maven的基本使用,為了加深對Maven中配置檔案和基本指令的學習,我們就不使用IDEA等整合MavenIDE了,直接使用VS CODE來進行接下來案例的講解。

首先,我們先建立一個名為maven的資料夾,然後通過VS CODE開啟,新建一個名為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/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這個根元素下還有四個同級的元素,下面再一一介紹:

  • modelVersion:制定了當前POM模型的版本,對於Maven2和Maven3來說,這個值固定為 4.0.0。
  • groupId:定義了專案屬於哪個組,一般都是對應公司或組織的域名反寫並加上專案名,例如公司域名為abc.com,專案名為demo,那麼groupId就是com.abc.demo。
  • artifactId:定義了在當前Maven專案中的唯一的ID,當專案包含多個子專案時,我們就需要特別注意命名方式。
  • version:指定了當前專案的版本,SNAPSHOT意思是快照,即代表當前專案屬於不穩定的版本。
  • name:聲明瞭一個讓使用者更容易理解的專案名稱,改元素屬於可選項。

然後,我們就開始正式編寫專案的主程式碼,我們首先按照Maven規範,在maven資料夾下建立一個src/main/java目錄,然後在該目錄下再根據我們在XMLgroupIdartifactId的命名,建立檔案:com/butterfly/maven/demo/Sum.java,並寫入以下內容:

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命令進行編譯,可以得到以下輸出(第一次執行會下載很多外掛依賴,下面輸出中省略了這些下載輸出):

[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安裝及基本使用詳解

接下來,我們再編寫測試的程式碼,首先我們依舊按照Maven規範,在src/目錄下繼續建立test/java目錄,然後在編寫正式的測試程式碼之前,讓我們先引入JUnit的依賴,我們需要將pom.xml進行如下修改:

<!-- 新增在 project 根元素下 -->
<dependencies>
	<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
	</dependency>
</dependencies>

然後我們就可以編寫我們的測試程式碼了,我們在src/test/java/目錄下,建立demo/SumTest.java檔案,並寫入以下內容:

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,4}));
  }

}

然後我們在根目錄下開啟終端,並執行mvn clean test指令(第一次運行同樣會下載一些外掛,這裡也省略了這些下載輸出),可以在終端中得到以下資訊:

[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,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中的cleanresourcescompile這三個指定,不同的是,這裡還多了對測試包中進行的三個操作,分別是testResourcestestCompiletest,隨後列印了執行單元測試後的輸出,可以發現執行了一個測試(即為我們建立的testSum測試方法),並且沒有失敗的測試。

注意

對於不同版本的Maven,在第一次執行上述操作的時候,可能會有關於JDK版本方面的報錯,提示我們編譯版本過低,這時就需要在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在安裝依賴時,預設是從國外網址下載,因此為了加快下載速度,我們需要配置國內的映象,這時我們就需要對settings.xml檔案進行修改,這裡建議在修改之前做一個備份。開啟settings.xml後,通過查詢找到mirrors標籤,然後在內部新增如下配置即可:

<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同級,然後加入以下配置:

<localRepository>D:/jar</localRepository>

這樣,所有的依賴都會儲存在D:/jar目錄下了。

打包及執行

Maven裡,我們只要通過mvn clean package命令就可以對專案進行打包了(預設打包型別為jar),我們在cmd中輸入以上指令,可以得到下面的輸出(省略了和以上指令中相同的前幾個輸出):

[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相比,又多瞭如下幾行輸出:

[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/目錄下,我們可以開啟檔案資源管理器進行驗證:

image-20201002231242456

這樣,我們就可以在其它專案中,通過以下配置來引用我們自己的jar包了:

<dependency>
  <groupId>com.butterfly.maven</groupId>
  <artifactId>demo</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

不過,到目前為止,我們仍然沒有執行主程式碼中的main函式部分,由於預設生成的jar包中缺少manifest配置,因此上文生成的jar包並沒有辦法直接執行,為了生成能夠執行的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>

再次執行mvn clean install命令,可以發現target/目錄下有兩個jar包:

image-20201002233707696

其中orgin開頭的jar包則對用我們之前無法直接執行的jar包,另外一個則是可以直接執行的,我們可以進行測試:

image-20201002233911687

大功告成!

總結

本文簡單介紹了Maven,並講解了Maven的安裝和幾個基本的命令的使用,在之後我還會繼續講解Maven其他方面的知識,希望能夠對你有所幫助。

參考資料

《Maven 實戰》

https://maven.apache.org/what-is-maven.html

到此這篇關於實戰講解Maven安裝及基本使用詳解的文章就介紹到這了,更多相關Maven安裝及基本使用內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!