淺談Maven的build生命周期和常用plugin
簡(jiǎn)介
Maven為我們封裝了很多構(gòu)建中非常有用的操作,我們只需要執(zhí)行簡(jiǎn)單的幾個(gè)mvn命令即可。
今天我們要討論一下mvn命令之下的生命周期的構(gòu)建。
lifecycle和Phases
所謂lifecycle,可以理解為可以執(zhí)行一組命令的集合,用來(lái)執(zhí)行具體的某些操作。
Maven默認(rèn)有三種lifecycle:default,clean和site。default主要用來(lái)處理項(xiàng)目的開(kāi)發(fā),clean主要用來(lái)負(fù)責(zé)項(xiàng)目的清理,site主要用來(lái)生成項(xiàng)目的文檔。
lifecycle是由一個(gè)或者多個(gè)phase組成的。
以default為例,它大概由23個(gè)phases組成,這些phases將會(huì)按順序執(zhí)行來(lái)完成default的lifecycle。
我們選取default lifecycle中非常常見(jiàn)的幾個(gè)phase來(lái)說(shuō)明一下:
- validate - 用來(lái)驗(yàn)證項(xiàng)目是否正確或者項(xiàng)目所需要的信息是否可用。
- compile - 用來(lái)編譯項(xiàng)目代碼
- test - 執(zhí)行代碼中的單元測(cè)試
- package - 將編譯后的代碼進(jìn)行打包,打包可有很多種方式,比如:jar,war等
- verify - 執(zhí)行集成測(cè)試
- install - 將項(xiàng)目安裝到本地倉(cāng)庫(kù)中,供有依賴(lài)關(guān)系的其他項(xiàng)目使用
- deploy - 將項(xiàng)目部署到遠(yuǎn)程倉(cāng)庫(kù),以便共享給其他的用戶(hù)
上面的phase執(zhí)行是有順序的,比如我們?nèi)绻麍?zhí)行mvn verify,則會(huì)順序執(zhí)行validate,compile,test和package。
Phases和Goals
Phases是一種任務(wù)的集合,它是由一個(gè)或者多個(gè)Goals組成的。Goals可以包含在Phases里面執(zhí)行,也可以單獨(dú)用命令執(zhí)行。
那么Goals又是從哪里來(lái)的呢?Goals是定義在maven中的plugin中的。
我們看下面一張直觀的圖:

下圖列出了現(xiàn)有l(wèi)ifecycle中的phase,和相應(yīng)phase所對(duì)應(yīng)的plugin。
我們可以看到基本每個(gè)phase都和一個(gè)plugin中的golas是相對(duì)于應(yīng)的。
除了使用命名直接指定要執(zhí)行的phase以外,還可以直接指定goals:
mvn clean dependency:copy-dependencies package
上面的命令中clean和package是phase,而copy-dependencies則是goals。
常用plugin介紹
這里我們介紹兩個(gè)非常常用的maven plugin,maven-dependency-plugin和maven-jar-plugin。
maven-dependency-plugin
maven中的依賴(lài)jar包是存放在maven的本地倉(cāng)庫(kù)中的,如果項(xiàng)目中依賴(lài)了某些jar包,在部署的時(shí)候還需要這些依賴(lài)的jar包拷貝出來(lái),非常不方便,有了maven-dependency-plugin,則可以借用它的copy-dependencies來(lái)將項(xiàng)目的依賴(lài)jar包拷貝出啦,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
goals是和相應(yīng)的phase相關(guān)聯(lián)的,在上面的例子中,我們將copy-dependencies和package相關(guān)聯(lián),則在我們執(zhí)行mvn package的時(shí)候就會(huì)自動(dòng)執(zhí)行copy-dependencies,從配置文件可以知道,我們將會(huì)把項(xiàng)目的依賴(lài)jar包拷貝到項(xiàng)目的build目錄的lib目錄下。
maven-jar-plugin
有了依賴(lài)的lib,可以將main程序打包成為一個(gè)可執(zhí)行的jar包。這時(shí)候我們就需要使用到maven-jar-plugin。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.flydean.MavenClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
為了生成可執(zhí)行的jar包,我們需要在MANIFEST.MF文件中添加mainClass文件的路徑,這樣在執(zhí)行jar包的時(shí)候,無(wú)需額外的參數(shù)即可運(yùn)行。
遺憾的是,如果我們的class文件用到了外部jar包的依賴(lài)時(shí)候,jar包直接運(yùn)行會(huì)出錯(cuò),因?yàn)檎也坏剿蕾?lài)的jar包。
在介紹maven-dependency-plugin的時(shí)候,我們已經(jīng)把所用到的lib拷貝出來(lái)了,這里我們可以直接使用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.flydean.MavenClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
多加了兩個(gè)addClasspath的參數(shù),我們將打包好的jar包解壓縮。
可以看到里面多了一個(gè)MANIFEST.MF的文件:
Manifest-Version: 1.0
Created-By: Maven Jar Plugin 3.2.0
Build-Jdk-Spec: 14
Class-Path: lib/lombok-1.18.10.jar lib/logback-classic-1.2.3.jar lib/log
back-core-1.2.3.jar lib/slf4j-api-1.7.25.jar
Main-Class: com.flydean.MavenClass
這個(gè)文件里面包含了一些jar包的元數(shù)據(jù),并且里面添加了Class-Path和Main-Class文件,這時(shí)候執(zhí)行運(yùn)行jar包就可以直接執(zhí)行了。
以上就是淺談Maven的build生命周期和常用plugin的詳細(xì)內(nèi)容,更多關(guān)于Maven的build生命周期和常用plugin的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring中@Conditional注解的詳細(xì)講解及示例
這篇文章主要介紹了Spring中@Conditional注解的詳細(xì)講解及示例,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿(mǎn)足條件給容器注冊(cè)bean,需要的朋友可以參考下2023-11-11
詳解Java volatile 內(nèi)存屏障底層原理語(yǔ)義
為了保證內(nèi)存可見(jiàn)性,java 編譯器在生成指令序列的適當(dāng)位置會(huì)插入內(nèi)存屏障指令來(lái)禁止特定類(lèi)型的處理器重排序。為了實(shí)現(xiàn) volatile 內(nèi)存語(yǔ)義,JMM 會(huì)分別限制這兩種類(lèi)型的重排序類(lèi)型2021-09-09
Java實(shí)現(xiàn)的打地鼠小游戲完整示例【附源碼下載】
這篇文章主要介紹了Java實(shí)現(xiàn)的打地鼠小游戲,結(jié)合完整實(shí)例形式分析了Java多線程操作及鍵盤(pán)按鍵響應(yīng)實(shí)現(xiàn)的打地鼠游戲功能相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
Springboot?2.x?RabbitTemplate默認(rèn)消息持久化的原因解析
這篇文章主要介紹了Springboot?2.x?RabbitTemplate默認(rèn)消息持久化的原因解析,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Java如何主動(dòng)從當(dāng)前線程獲取異常信息
這篇文章主要介紹了Java如何主動(dòng)從當(dāng)前線程獲取異常信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
深入解析反編譯字節(jié)碼文件中的代碼邏輯JVM中的String操作
這篇文章主要介紹了深入解析反編譯字節(jié)碼文件中的代碼邏輯JVM中的String操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

