首頁:https://maven.apache.org/
下載頁面:https://maven.apache.org/download.cgi
和Tomcat 是一樣的,將下載的安裝包,解壓便是下載了,需要注意的是:解壓的路徑不可以有中文,以及空格
核心程序壓縮包:apache-maven-3.8.4-bin.zip,解壓到非中文、沒有空格的目錄。例如:
解壓安裝到指定要求的目錄中以后,我們需要對 Maven進行一個配置。
而關于 Maven 的配置,都是在其中解壓安裝的 Maven 的conf/settings.xml 這個 xml 文件當中。該 settings.xml是 Maven的核心配置文件。基本上所有關于 Maven的配置都是在這個文件配置的。如下是:
這里我使用的是 Notepad++ 打開的,大家可以使用其他的,編譯應用打開,不建議使用記事本打開,因為記事本,沒有代碼高亮,如何出錯。
配置本地倉庫:
所謂的本地倉庫:就是一個關于 Maven的一些依賴的jar,war 等等的安裝位置,類似于我們運用 Git 工具進行一個版本控制的本地倉庫。
本地倉庫默認值:用戶目錄/.m2/repository。由于本地倉庫的默認位置是在用戶的家目錄下,而家目錄往往是在 C 盤,也就是系統盤。**將來 Maven 倉庫中 jar 包越來越多,倉庫體積越來越大,可能會拖慢 C 盤運行速度,影響系統性能。**所以建議將 Maven 的本地倉庫放在其他盤符下。
對于:Maven的本地倉庫的配置要運用的是:<localRepositoryXXX</localRepository>這個標簽,如下,我們可以看到,在Maven 當中的 settings.xml配置文件當中是被其默認注釋掉了。
我們只需要將其復制出來,并把其中注釋去了,在其中配置好我們本地倉庫的路徑就可以了。如下:
上面配置的路徑對應的文件不存在的話,等執行構建命令時 Maven 會自行創建出來的,當然,為了防止出錯,什么權限不足等等問題,你也可以先創建出來,一般都是可以自行創建出來的。
注意: 該配置的本地倉庫的路徑,不可以有中文,也不可以有空格,要用全英文字母。
配置方式如下:
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!--配置 Maven的本地倉庫-->
<!-- 這個目錄可以等執行構建命令時 Mavnen 自行創建出來-->
<localRepository>G:\devData\maven-repository</localRepository>
本地倉庫這個目錄,我們手動創建一個空的目錄即可。記住:一定要把 localRepository 標簽從注釋中拿出來。注意:本地倉庫本身也需要使用一個非中文、沒有空格的目錄。
配置好 Maven的本地倉庫接下來就是,配置 Mavne 的鏡像倉庫了。
所謂的鏡像倉庫: 主要就是對于,我們訪問國外的一些信息資源過慢,而本國對其信息資源進行一個拷貝。如果我們下載國外的資源速度比較慢的時候,我們可以通過找到其鏡像倉庫,通過本國的鏡像倉庫中找到其對應的資源,進行一個下載。
什么我們訪問國外的資源比較慢:因為距離過遠了,光纜可能走的是地下的,又走海上的等等,距離過遠,還可能被各種環境因素影響到。
而我們的 Maven 下載的 jar 包資源,默認訪問就是國外的中央倉庫(注意:在Maven 當中,中央倉庫就只有一個。),因為 Maven國外開發的嗎?而國外網站速度很慢。所以這里,我們改成阿里云提供的鏡像倉庫,訪問國內網站,可以讓 Maven 下載 jar 包的時候速度更快。**注意:**這里我們改的只是為,中央倉庫配置一個備用,并不是修改了中央倉庫,中央倉庫還是國外的,當中央倉庫無法訪問到的時候,走的,訪問的就是我們配置的鏡像倉庫了。
配置Maven的鏡像倉庫需要使用到的標簽是:<mirror>XXXX</mirror> 需要注意的一點就是:該標簽是在:<mirrors></mirrors> 標簽定義的。如下:Maven 默認是注釋掉了的。
如下就是阿里云提供的鏡像倉庫。大家復制,粘貼過去就好了,注意該 標簽是在 標簽下的。
將下面 mirror 標簽整體復制到 settings.xml 文件的 mirrors 標簽的內部。
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
Maven 是由 java程序編寫的,需要通過JDK編譯,啟動運行。
這里我們需要配置一下,Maven 運行編譯的 JDK版本,盡量如自己安裝的,JDK版本對應上就可以了。
如果按照默認配置運行,Java 工程使用的默認 JDK 版本是 1.5,而我們熟悉和常用的是 JDK 1.8 版本。修改配置的方式是:
使用 <profile>XXX</profile>標簽進行配置。默認Maven是將其注釋掉了,如下:
注意:該標簽是在 內的,不要放錯位置了如下:
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
Maven 是一個用 Java 語言開發的程序,它必須基于 JDK 來運行,所以,我們需要先將 JDK的環境變量配置好,這里我就不多說明了。因為這里我們只要講的是 Maven 。
我們可以先檢查一下 java的環境變量是否存在問題:使用命令 java -version。 如下,我這里的 java 環境變量是沒有問題的。
下面我們來配置:Maven 的環境變量:
點擊系統變量,點擊新建:
變量名: MAVEN_HOME
變量值: G:\dev\apache-maven-3.8.8
注意:這里的路徑是 Maven 安裝路徑當中的 bin 目錄的上一層。如下圖:
后再配置 PATH
%MAVEN_HOME%\bin
配置好以后,注意要點擊 三個確定 ,一個都不能少。
配置環境變量的規律:
XXX_HOME 通常指的都是 bin 目錄的上一級目錄。
PATH的配置一般都是在上次配置的 XXX_HOME 的變量名,加上兩個% 百分號,以及bin 。比如%XXX_HOME%\bin。
測試,我們的Maven 是否是否安裝成功:
打開 命令行窗口 Win + R, ——> cmd ,如下有版本信息顯示,基本上就沒有什么問題了。
mvn -v # mvn 表示的是 Maven的簡寫
Spring團隊致力于為Spring應用程序提供原生映像支持已經有一段時間了。在SpringBoo2.x的Spring Native實驗項目中醞釀了3年多之后,隨著Spring Framework 6和Spring Boot 3的發布,對應的項目就是Spring Native,原生鏡像支持將會發布GA版本(換言之就是,Native Image相關支持會在Spring Boot 3的GA版本中一起發布)。
前面這一段簡介摘抄自參考資料中的《Native Support in Spring Boot 3.0.0-M5》
筆者在寫這篇文章(2022-10-28)前后SpringBoot尚未發布3.x GA,版本3.0.0-M5+算是GA前相對穩定的版本,這里選用當前3.x的最新非GA版本3.0.0-RC1進行調研。
Native Image,這里直譯為原生鏡像或者本地鏡像,是一種提前將(Java)代碼編譯為二進制文件(原生可執行文件,native executable)的技術。原生可執行文件只包含運行時所需要的代碼,即應用程序類、標準庫類、語言運行時和來自JDK的靜態鏈接的原生代碼(也就是這樣的二進制文件可以直接運行,不需要額外安裝JDK)。由原生鏡像生成的可執行文件有幾個重要的優點:
Spring Boot 3中使用GraalVM方案提供Native Image支持。
在https://www.graalvm.org/downloads - Download GraalVM頁面中下載對應操作系統的GraalVM:
筆者開發環境使用的操作系統是Windows10,下載和選用下圖中的安裝包:
解壓完成后配置一下JAVA_HOME、GRAALVM_HOME并且把GRAALVM_HOME\bin添加到PATH中。完成后可以執行一下java -version進行驗證:
如果已經安裝了其他版本的JDK,先暫時全局替換為GraalVM,也就是JAVA_HOME、GRAALVM_HOME同時配置為GraalVM的解壓目錄,因為目前看來這樣做才能正常打包原生鏡像
確定GraalVM版本無誤,到此安裝完成。另外,需要配置好了Maven,建議重新安裝一個3.6.x+版本的Maven并且把MAVEN_HOME\bin添加到PATH中。
新建一個命名為spring-boot-native-image的Maven項目或者模塊,選用剛才下載好的GraalVM:
項目的POM文件引入下面幾組依賴:
<!-- spring-boot-starter-parent -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0-RC1</version>
</parent>
<!-- repository -->
<repositories>
<repository>
<id>spring-snapshots</id>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>https://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
<!-- spring-boot-starter-web -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- native-maven-plugin -->
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>0.9.16</version>
<extensions>true</extensions>
<executions>
<execution>
<id>build-native</id>
<goals>
<goal>compile-no-fork</goal>
</goals>
<phase>package</phase>
</execution>
<execution>
<id>test-native</id>
<goals>
<goal>test</goal>
</goals>
<phase>test</phase>
</execution>
</executions>
<configuration>
<mainClass>cn.vlts.NativeApplication</mainClass>
<imageName>native-app</imageName>
<buildArgs>
<buildArg>--verbose</buildArg>
</buildArgs>
</configuration>
</plugin>
</plugins>
最終的POM文件看起來如下:
項目中只有一個啟動類cn.vlts.NativeApplication,編寫了main方法和一個用于集成測試的控制器方法:
@RestController
@SpringBootApplication
public class NativeApplication {
public static void main(String[] args) {
SpringApplication.run(NativeApplication.class, args);
}
@GetMapping(path="/hello")
public ResponseEntity<String> hello() {
return ResponseEntity.ok("world");
}
}
完成項目配置和代碼編寫后,執行下面的Maven命令進行打包:
mvn package -Pnative
打包過程可能會遇到下面的問題:
解決方案在Stackoverflow對應的問題回答中找到:
其實就是在Window操作系統開發環境下基于GraalVM構建原生鏡像依賴Microsoft Visual C++ (MSVC),建議安裝MSVC 2017 15.5.5+,可以安裝Visual Studio (2019)并且安裝對應的MSVC。
因為很早之前筆者在調試Rust時候已經安裝過Visual Studio 2019用于其debug工具鏈,這里無須進行安裝。在安裝Visual Studio勾選MSVC vXXX的組件進行安裝即可,然后需要把對應的MSVC工具的bin目錄添加到PATH中(這個目錄一般是VS_HOME\VC\Tools\MSVC\版本號\bin\Hostx64\x64):
其實還是因為MSVC的問題,在GraalVM文檔中有提示如下:
簡單來說就是必須在Visual Studio自帶的命令行工具x64 Native Tools Command Prompt中執行native image相關命令,這個命令行工具初始化如下:
在x64 Native Tools Command Prompt中先進入目標項目根目錄,然后執行mvn -Pnative package:
最終看到BUILD SUCCESS字眼,項目的target目錄下可以看到一個.exe和一個.jar文件,而.exe文件就是前面一直提到的可執行的二進制文件:
直接運行它:
可以看到這個文件運行完全不依賴外部Java虛擬機,并且啟動速度極快(600毫秒左右),可以用POSTMAN等工具測試程序接口:
到此可以驗證程序功能正常。
SpringBoot3.x原生鏡像正式發布后會是SpringBoot在云原生領域的一個巨大進步,讓我們拭目以待。但是就目前來看,常用的Windows開發環境下想要嘗試native image技術需要解決比較多的問題,Linux和Unix平臺下尚未驗證,希望后面的版本迭代能夠降低使用難度并且支持一個命令多平臺打包的功能